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>();
}
使用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
并检查结果是否为空。