2017-04-19 127 views
0

是否可以通過內部屬性值對集合進行分組?我將如何做到這一點,而不用僅使用Linq創建一個新對象。或者我需要在分組過程之前創建匿名對象。LINQ,GroupBy具有對象類型的字段的內部值

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

我通過WID財產需要這組LST變量。

+0

但是,你如何期望組'物品'有多個'ItemInv'? – octavioccl

+0

通過wid域不同組中的一個對象 – iSarzhan

+0

在同一個「Inventory」列表中是否可以有重複的「wid」值?注意:如果沒有一些中間步驟,就無法做到這一點,因爲您需要爲「Inventory」列表中的每個項目「複製」對象(以及對象的引用)。 – ErikE

回答

0

要組Item S按所述ItemInv s的在他們的集合,第一拼合嵌套集合,然後組由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(); 

出於測試:

// 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 

請參閱目前的分組是inv.wid。如果您希望使用ItemInv實例進行分組,您必須先覆蓋EqualsGetHashCode

0

我想我有幾乎與吉拉德格林相同的解決方案,但在方法語法。

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

'z','y'和'x'是*糟糕的變量名稱。 – ErikE

+0

@ErikE同意,這很懶。編輯。 – phhlho

+0

值得一提的是,'Tuple'看起來不是一個值類型,所以在使用'KeyValuePair'時可能會有一些性能值,因爲每個值都可以分配到堆棧而不是堆中。 – ErikE