从IEnumerable<T>选择到IEnumerable<Quantity<T>>。

3
比如说,我有一个这样的集合:

Apple
Banana
Banana
Apple
Apple
Pear
Banana
Grape
Orange
Pear

如您所见,这些物品有一些是多个的。我想要一个集合来显示物品及其数量。例如,上面的数据将显示为:

Apple (3)
Banana (3)
Pear (2)
Grape (1)
Orange (1)

我创建了一个类...

public class Quantity<T>
{
    public Quantity(T item, int count)
    {
        Item = item;
        Count = count;
    }

    public T Item { get; private set; }
    public int Count { get; private set; }
}

我假设可以使用LINQ来完成,通过使用某种Select语句将IEnumerable<T>投射到IEnumerable<Quantity<T>>中...话虽如此,我不知道该怎么开始 :-| ...有什么想法吗?


你可以从 GroupBy 开始 :) - Ivan Stoev
2个回答

5
如果输入是字符串,则可以使用以下带有选择投影的GroupBy。
var result = food.GroupBy(fruit => fruit)
                    .Select(fruit => new Quantity<string>(fruit.Key, fruit.Count()));

1
你可以使用LINQ提供的GroupBy方法。它通过将特定值相同的项分组到不同的集合中来实现分组。
请参考以下示例:
var fruits = new[] { "Apple", "Apple", "Banana", "Banana" };
var quantities = fruits.GroupBy(
  (f) => f,
  (f) => f,  
  (f, fs) => new Quantity<string>(f, fs.Count())
);

要查看此示例的实际效果,请查看以下 .NET fiddle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接