Linq到对象-当涉及let子句时,将查询形式转换为点表示法

本文关键字:查询 转换 表示 对象 子句 let Linq | 更新日期: 2023-09-27 18:19:24

从msdn读取Linq到对象时,我得到了一个示例查询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>();
}

Linq到对象-当涉及let子句时,将查询形式转换为点表示法

使用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);

从技术上讲,你根本不需要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());

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

我不会尝试通过将其转换为方法语法来进行"优化"。

但是,如果您想优化代码,而不仅仅是将其转换为方法语法,您可以将其减少到一次调用Except并检查结果是否为空。