2017-07-04 3 views
0

Ich habe einige Probleme. Ich soll eine Definition von GroupBy implementieren. Ich bin nicht sicher, wie man die Werte in Paaren gruppiert, kann mir jemand helfen?IGrouping, IEnumerable und Pairs

class Pair<K, V> { 
    public Pair(K key, V value) { 
     Key = key; 
     Value = value; 
    } 
    public K Key { get; set; } 
    public V Value { get; set; } 
} 

Haupt: Kann LINQ nicht

Definition von Pair verwenden

string[] src = { "ola", "super", "isel", "ole", "mane", "xpto", "aliba" }; 
foreach (Pair<int, IEnumerable<string>> pair in src.GroupBy(s => s.Length)) 
{ 
    Console.WriteLine("{0}: {1}", pair.Key, string.Join(", ", pair.Value)); 
} 

Ausgabe

/** 
* Output: 
* 3: ola, ole 
* 5: super, aliba 
* 4: isel, mane, xpto 
*/ 
+0

'GroupBy' wird nicht' Paar 'zurückgeben. Es ist vom Typ 'System.Linq.GroupedEnumerable '. –

Antwort

2

Um einen Pair<int, IEnumerable<string>> von einem IEnumerable<IGrouping<TKey, TSource>> du wirst vornehmen müssen dies:

foreach (Pair<int, IEnumerable<string>> pair in src.GroupBy(s => s.Length) 
    .Select(x => new Pair<int, IEnumerable<string>>(x.Key, x.ToList())) 
) 

Aber ich bin mir nicht sicher, warum jemand das verwenden sollte.

Ganz einfacher zu bedienen ist nur dies:

foreach (var pair in src.GroupBy(s => s.Length)) 
{ 
    Console.WriteLine("{0}: {1}", pair.Key, string.Join(", ", pair.ToList())); 
} 

Auf diese Weise können dn't sogar Ihre Pair -Klasse müssen.

+0

Nicht sicher, was mit der Verwendung eines 'Dictionary ' falsch ist? – Rahul

+0

@Rahul Es wird zum Beispiel die gesamte Sammlung in den Speicher geladen, was eine schlechte Idee ist, wenn die Sammlung groß ist. Zweitens, warum sollten Sie überhaupt ein Wörterbuch machen? Es fügt keinen Wert hinzu, um jede Gruppe einzeln zu iterieren. – HimBromBeere

+0

Ihre Interpretation ist falsch ... Kommentar war für OP gedacht und nicht Sie, Bruder. Ich meinte stattdessen ein Wörterbuch zu verwenden 'Paar >' – Rahul

0

Der Code nach GroupBy (d. H. Der Select) projiziert die Daten in die Klasse Pair, die Sie verwenden möchten.

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace Test 
{ 
    public class Program 
    { 
     class Pair<K, V> 
     { 
      public Pair(K key, V value) 
      { 
       Key = key; 
       Value = value; 
      } 
      public K Key { get; set; } 
      public V Value { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      string[] src = { "ola", "super", "isel", "ole", "mane", "xpto", "aliba" }; 
      var pairs = src.GroupBy(s => s.Length) 
       .Select(@group => new Pair<int, IEnumerable<string>>(@group.Key, @group)); 

      foreach (var pair in pairs) 
      { 
       Console.WriteLine("{0}: {1}", pair.Key, string.Join(", ", pair.Value)); 
      } 

      Console.ReadLine(); 
     } 
    } 
}