2016-07-23 27 views
3

Say ich zum Beispiel eine Sammlung haben wie so:<Quantity<T>>

Apple 
Banana 
Banana 
Apple 
Apple 
Pear 
Banana 
Grape 
Orange 
Pear 

Wie Sie sehen können, gibt es ein Vielfaches von einigen dieser Elemente. Was ich will, ist eine Sammlung, die den Gegenstand und seine Quantität zeigt. Zum Beispiel über die Daten, wäre so etwas wie folgt aus:

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

ich eine Klasse erstellt haben ...

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; } 
} 

Ich bin Vermutung kann es mit LINQ mit irgendeiner Art von Select erfolgen Aussage, die von IEnumerable<T> zu IEnumerable<Quantity<T>> projizieren würde ... das gesagt zu haben, habe ich nicht das foggiest, wie man beginnt: - | ...irgendwelche Ideen?

+0

Sie beginnen mit 'GroupBy' :) –

Antwort

5

Wenn die Eingänge string sind, können Sie die folgende GroupBy mit Select-Projektion verwenden.

var result = food.GroupBy(fruit => fruit) 
        .Select(fruit => new Quantity<string>(fruit.Key, fruit.Count())); 
1

können Sie die von LINQ bereitgestellt GroupBy Methode verwenden. Es funktioniert, indem Elemente gruppiert werden, bei denen ein bestimmter Wert in separaten Mengen identisch ist.

Siehe das folgende Beispiel:

var fruits = new[] { "Apple", "Apple", "Banana", "Banana" }; 
var quantities = fruits.GroupBy(
    (f) => f, 
    (f) => f, 
    (f, fs) => new Quantity<string>(f, fs.Count()) 
); 

dieses Beispiel in Aktion zu sehen, .NET fiddle nach dem Check-out.

Verwandte Themen