2011-08-09 22 views
1

我学习LINQ,我想知道是否可以简化以下LINQ查询...我现在就可以简化这个LINQ查询

我有两个字符串,我解析连接字符串来算使用每个单词。我想知道是否可以保留一个LINQ表达式,但不必复制from和let表达式中的string.Concat部分。

 string sentence = "this is the first sentence"; 
     string sentence2 = "this is the second sentence"; 

     var res = from word in string.Concat(sentence, sentence2).Split() 
        let combinedwords = string.Concat(sentence, sentence2).Split() 
        select new { TheWord = word, Occurance = combinedwords.Count(x => x.Equals(word)) }; 

回答

4

您的查询返回一个略微怪异的结果集:

TheWord   Occurrence 
this   1 
is    2 
the    2 
first   1 
sentencethis 1 
is    2 
the    2 
second   1 
sentence  1 

这是你想要的东西,否则你将你喜欢的结果,更是这样?

TheWord   Occurrence 
this   2 
is    2 
the    2 
first   1 
sentence  2 
second   1 

要获得这些结果,你可以做这样的事情:

var res = from word in sentence.Split() 
           .Concat(sentence2.Split()) 
      group word by word into g 
      select new { TheWord = g.Key, Occurrence = g.Count() }; 

另一种选择;更好(理论)性能,但可读性较差:

var res = sentence.Split() 
        .Concat(sentence2.Split()) 
        .Aggregate(new Dictionary<string, int>(), 
          (a, x) => { 
              int count; 
              a.TryGetValue(x, out count); 
              a[x] = count + 1; 
              return a; 
             }, 
          a => a.Select(x => new { 
                 TheWord = x.Key, 
                 Occurrence = x.Value 
                })); 
+0

谢谢,那就是我一直在寻找的东西。 –