Linq to Objects - 当涉及let子句时,将查询表单转换为点表示法

时间:2015-10-27 16:11:52

标签: c# linq

在从msdn阅读Linq to Objects时,我得到了一个示例查询https://msdn.microsoft.com/en-us/library/bb546163.aspx示例是在linq查询表单中,我尝试将其转换为方法表单。该查询包含let个关键字。我需要建议如何优化我编写的方法表单,更具体地说,在转换为方法表单时如何处理let。 到目前为止,我尝试过这么多

internal static string[] GetSpecificSentenceContainingParticularWords(
    string sentenceToSearch, 
    string[] WordsToMatch)
{
    if (string.IsNullOrEmpty(sentenceToSearch) 
        || WordsToMatch == null 
        || WordsToMatch.Count() == 0)
        return null;

    string[] sentences = sentenceToSearch.Split(new char[] { '.' });

    var returnSentences = from s in sentences
                          let w = s.Split(new char[] { ' ' })
                          where w.Distinct().Intersect(WordsToMatch).Count() 
                                == WordsToMatch.Count()
                          select s;     

    returnSentences = sentences.Where((s) =>
    {
        var a = s.Split(new char[] { ' ' }); //splitting a sentence to words
        return (a.Distinct().Intersect(WordsToMatch).Count() == WordsToMatch.Count());
    });

    return returnSentences.ToArray<string>();
}

3 个答案:

答案 0 :(得分:1)

借助Resharper

var returnSentences = sentences.Select(s => new {s, w = s.Split(' ')})
                .Where(@t => @t.w.Distinct().Intersect(WordsToMatch).Count() == WordsToMatch.Count())
                .Select(@t => @t.s);

答案 1 :(得分:0)

从技术上讲,您首先不需要let

var returnSentences = from s in sentences
                      where s.Split(new char[] { ' ' })
                             .Distinct()
                             .Intersect(WordsToMatch)
                             .Count() == WordsToMatch.Count()
                      select s;

所以你可以做到

var returnSentences = sentences.Where(s => s.Split(new char[] { ' ' })
                                            .Distinct()
                                            .Intersect(WordsToMatch)
                                            .Count() == WordsToMatch.Count());

答案 2 :(得分:0)

我个人更喜欢每个场景的方法语法,除了这个场景。使用方法语法,您必须将计算的值存储为匿名对象的属性。使用查询语法和let,您不必跳过任何环节。

我不会尝试&#34;优化&#34;通过将其转换为方法语法。

如果您希望优化代码而不仅仅是将其转换为方法语法,则可以将其缩减为对Except的一次调用,并检查结果是否为空。