Подсчет слов в наборе с помощью LINQ

Я сделал, чтобы StringCollection возразил с 5 словами в них. 3 из них являются дублирующимися словами. Я пытаюсь создать запрос LINQ, который рассчитает, к скольким уникальные слова находятся в наборе и производят их к консоли. Так, например, если мой StringCollection имеет 'Дом', 'Автомобиль', 'Дом', 'Собаку', 'CAT', то он должен произвести как это:

House --> 2
Car --> 1
Dog --> 1
Cat --> 1

Какие-либо идеи о том, как создать запрос LINQ, чтобы сделать это?

7
задан dtb 11 June 2010 в 22:16
поделиться

7 ответов

Попробуйте следующее

var res = from word in col.Cast<string>()
          group word by word into g
          select new { Word = g.Key, Count = g.Count() };
11
ответ дан 6 December 2019 в 11:45
поделиться
var xs = new StringCollection { "House", "Car", "House", "Dog", "Cat" };

foreach (var g in xs.Cast<string>()
                    .GroupBy(x => x, StringComparer.CurrentCultureIgnoreCase))
{
    Console.WriteLine("{0}: {1}", g.Key, g.Count());
}
4
ответ дан 6 December 2019 в 11:45
поделиться
foreach(var g in input.GroupBy(i => i.ToLower()).Select(i => new {Word = i.Key, Count = i.Count()})
{
  Console.WriteLine(string.Format("{0} -> {1}", g.Word, g.Count));
}
0
ответ дан 6 December 2019 в 11:45
поделиться

Это должно быть так же просто, как:

Console.WriteLine(stringCollection.Distinct().Count());
0
ответ дан 6 December 2019 в 11:45
поделиться

Учитывая, что вы используете StringCollection и хотите игнорировать регистр, вам нужно использовать Enumerable.GroupBy с Enumerable.Cast :

var results = collection.Cast<string>.GroupBy(
        i => i,
        (word, words) => new { Word = word, Count = words.Count() },
        StringComparer.CurrentCultureIgnoreCase
    );

foreach(var wordPair in results)
     Console.WriteLine("Word: \"{0}\" - Count: {1}", wordPair.Word, wordPair.Count);
1
ответ дан 6 December 2019 в 11:45
поделиться
var query =    
  from s in Collection  
  group s by s.Description into g  
  select new {word = g.Key, num = g.Count()};
0
ответ дан 6 December 2019 в 11:45
поделиться

Для построения единственного строкового значения результат ...

var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" };
var result = stringCollection.Cast<string>().GroupBy(
                                  k => k, 
                                  StringComparer.InvariantCultureIgnoreCase)
                             .Select(v => v.Key + " -->" + v.Count())
                             .Aggregate((l,r)=>l+" " + r);
//result = "House -->2 Car -->1 Dog -->1 Cat -->1"

Чтобы поместить каждое значение в отдельную строку ...

var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" };
var result = stringCollection.Cast<string>().GroupBy(
                                  k => k, 
                                  StringComparer.InvariantCultureIgnoreCase);

foreach (var value in result)
    Console.WriteLine("{0} --> {1}", value.Key, value.Count());
1
ответ дан 6 December 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: