Подсчет слов в коллекции с помощью 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));
}
var query =
from s in Collection
group s by s.Description into g
select new {word = g.Key, num = g.Count()};