Подсчет слов в коллекции с помощью LINQ

У меня есть объект StringCollection с 5 словами в них. 3 из них повторяющиеся слова. Я пытаюсь создать запрос LINQ, который будет подсчитывать, сколько уникальных слов находится в коллекции и выводить их на консоль. Так, например, если моя коллекция StringCollection имеет "дом", "автомобиль", "дом", "собака", "кошка", то она должна выводиться следующим образом:

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

есть идеи о том, как создать запрос LINQ для этого?

7 ответов


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

var res = from word in col.Cast<string>()
          group word by word into g
          select new { Word = g.Key, Count = g.Count() };

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

учитывая, что вы используете StringCollection и хотите игнорировать case, вам нужно будет использовать перечисли.Метода groupBy С перечисли.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);

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

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

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

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

Console.WriteLine(stringCollection.Distinct().Count());

var query =    
  from s in Collection  
  group s by s.Description into g  
  select new {word = g.Key, num = g.Count()};