LINQ,GroupBy具有对象类型的字段的内部值

时间:2017-04-19 18:03:16

标签: c# linq

是否可以按内部属性值进行分组?如果不使用Linq创建新对象,我该怎么做呢?或者我需要在分组过程之前创建匿名对象。

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 属性对此第一个变量进行分组。

2 个答案:

答案 0 :(得分:0)

要将Item的{​​{1}}与其馆藏分组,首先展平嵌套馆藏,然后按ItemInv分组:

ItemInv

进行测试:

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个实例进行分组,则必须先覆盖ItemInvEquals

答案 1 :(得分:0)

我认为我有与Gilad Green几乎相同的解决方案,但是在方法语法方面。

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