Я сделал, чтобы StringCollection возразил с 5 словами в них. 3 из них являются дублирующимися словами. Я пытаюсь создать запрос LINQ, который рассчитает, к скольким уникальные слова находятся в наборе и производят их к консоли. Так, например, если мой StringCollection имеет 'Дом', 'Автомобиль', 'Дом', 'Собаку', 'CAT', то он должен произвести как это:
House --> 2 Car --> 1 Dog --> 1 Cat --> 1
Какие-либо идеи о том, как создать запрос LINQ, чтобы сделать это?
Попробуйте следующее
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());
}
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());
Учитывая, что вы используете 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);
var query =
from s in Collection
group s by s.Description into g
select new {word = g.Key, num = g.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());