2017-04-19 3 views
0

hat Ist es möglich, Sammlung durch innere Eigenschaftswert zu gruppieren? Wie würde ich dies tun, ohne ein neues Objekt mit nur Linq zu erstellen. Oder ich muss anonymes Objekt vor dem Gruppierungsprozess erstellen.LINQ, GroupBy innerer Wert des Feldes, das den Objekttyp

public class Item 
{ 
    public int Id { get; set; } 
    public List<ItemInv> Inventory {get; set;} 
} 

public class ItemInv 
{ 
    public int wid {get; set;} 
} 

var lst = new List<Item> { 
    new Item { 
     Id=1, 
     Inventory= new List<ItemInv> { new ItemInv() { wid = 2 } } 
    }, 
    new Item { 
     Id=2, 
     Inventory= new List<ItemInv> { new ItemInv() { wid = 2 }} 
    } 
}; 

Ich brauche Gruppe diese lst Variable von wid Eigenschaft.

+0

Aber wie erwarten Sie, 'Items' zu gruppieren, die mehr als einen' ItemInv' haben? – octavioccl

+0

ein Objekt in verschiedenen Gruppen von Wid Feld – iSarzhan

+0

Kann es doppelte 'Wid' Werte innerhalb der gleichen 'Inventory' Liste geben? Hinweis: Dies ist ohne Zwischenschritt nicht möglich, da Sie Objekte (also Verweise auf Objekte) für jedes Element in der Liste "Inventar" einmal duplizieren müssen. – ErikE

Antwort

0

Zur Gruppe des Item s durch die ItemInv s mit in ihren Sammlungen, zunächst die verschachtelten Sammlungen abflachen und dann die Gruppe von den ItemInv s:

var result = (from item in list 
       from inv in item.Inventory 
       group item by inv.wid into invGrouping 
       select new { 
        ItemInv = invGrouping.Key, 
        Items = invGrouping.ToList() 
       }).ToList(); 

Zum Testen:

// Testing data 
var list = new List<Item> { 
    new Item { 
     Id=1, 
     Inventory= new List<ItemInv> { new ItemInv() { wid = 2 } } 
    }, 
    new Item { 
     Id=2, 
     Inventory= new List<ItemInv> { 
      new ItemInv() { wid = 2 }, 
      new ItemInv() { wid = 3 } } 
    }, 
    new Item { 
     Id=3, 
     Inventory= new List<ItemInv> { 
      new ItemInv() { wid = 3 } } 
    } }; 

//Output: 
// wid 2 - Item id=1, Item id = 2 
// wid 3 - Item id=2, Item id = 3 

Sehen Sie, dass derzeit ist die Gruppierung durch die inv.wid. Wenn Sie eine Gruppierung durch die ItemInv Instanz wünschen, müssen Sie zuerst die Equals und GetHashCode überschreiben.

0

Ich denke, ich habe fast die gleiche Lösung wie Gilad Green, aber in Methodensyntax.

var itemsByWid = lst 
    .SelectMany(item => item.Inventory.Select(itemInv => Tuple.Create(itemInv, item))) 
    .GroupBy(itemTuple => itemTuple.Item1.wid, itemTuple => itemTuple.Item2); 
+0

'z',' y' und 'x' sind * schreckliche * Variablennamen. – ErikE

+0

@ErikE Einverstanden, das war ziemlich faul. Bearbeitet. – phhlho

+0

Für das, was es wert ist, sieht 'Tuple' aus, als wäre es kein Werttyp, und daher könnte es einen gewissen Leistungswert bei der Verwendung von' KeyValuePair' geben, da dann jeder auf dem Stapel statt auf dem Haufen zugewiesen werden kann. – ErikE