2017-04-19 124 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