Могу ли я упростить этот запрос LINQ - PullRequest
1 голос
/ 09 августа 2011

Я изучаю LINQ и хочу узнать, возможно ли упростить следующий запрос LINQ ...

Сейчас у меня есть две строки, и я анализирую объединенную строку, чтобы подсчитать использование каждого слова. Я хочу знать, возможно ли сохранить одно выражение LINQ, но не нужно реплицировать раздел string.Concat в выражениях from и let.

        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)) };

1 Ответ

4 голосов
/ 09 августа 2011

Ваш запрос возвращает немного странный набор результатов:

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
                                                    }));
...