C# 从IEnumerable中选择<;T>;到IEnumerable<;数量<;T>&燃气轮机;

C# 从IEnumerable中选择<;T>;到IEnumerable<;数量<;T>&燃气轮机;,c#,linq,C#,Linq,比如说,我有一个这样的收藏: 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,

比如说,我有一个这样的收藏:

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; }
}
公共类数量
{
公共数量(T项,整数计数)
{
项目=项目;
计数=计数;
}
公共T项{get;私有集;}
公共整数计数{get;私有集;}
}

我假设可以通过LINQ使用某种类型的
Select
语句,从
IEnumerable
投射到
IEnumerable
,也就是说,我不知道如何开始:-|…有什么想法吗?

如果输入是
string
,那么您可以使用下面的GroupBy和Select projection

var result = food.GroupBy(fruit => fruit)
                    .Select(fruit => new Quantity<string>(fruit.Key, fruit.Count()));
var result=food.GroupBy(水果=>水果)
.Select(水果=>新数量(fruit.Key,fruit.Count());
您可以使用LINQ提供的方法。它的工作原理是将特定值相同的项目分组为不同的集合

请参见以下示例:

var fruits = new[] { "Apple", "Apple", "Banana", "Banana" };
var quantities = fruits.GroupBy(
  (f) => f,
  (f) => f,  
  (f, fs) => new Quantity<string>(f, fs.Count())
);
var fruits=new[]{“苹果”、“苹果”、“香蕉”、“香蕉”};
变量数量=水果。分组比(
(f) =>f,
(f) =>f,
(f,fs)=>新数量(f,fs.Count())
);

要查看此示例的实际效果,请查看以下内容。

您从
GroupBy
开始: