2016-07-23 104 views
3

例如说我有一个集合,像这样:选择自IEnumerable <T>到IEnumerable的<Quantity<T>>

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>> ......这是说,我不是最模糊的如何开始: - | ...有任何想法吗?

+0

您以'GroupBy' :)开头:) –

回答

5

如果输入是string那么您可以使用以下GroupBy和Select投影。

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

相关问题