在从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>();
}
答案 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
的一次调用,并检查结果是否为空。