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

C# LINQ,GroupBy具有对象类型的字段的内部值,c#,linq,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<It

是否可以按内部属性值对集合进行分组?如何在不使用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 }}
    }
};
公共类项目
{
公共int Id{get;set;}
公共列表清单{get;set;}
}
公共类ItemInv
{
公共整数wid{get;set;}
}
var lst=新列表{
新项目{
Id=1,
库存=新列表{new ItemInv(){wid=2}}
},
新项目{
Id=2,
库存=新列表{new ItemInv(){wid=2}}
}
};

我需要按wid属性对该lst变量进行分组。

要按
ItemInv
s对
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
//测试数据
变量列表=新列表{
新项目{
Id=1,
库存=新列表{new ItemInv(){wid=2}}
},
新项目{
Id=2,
库存=新列表{
新的ItemInv(){wid=2},
新的ItemInv(){wid=3}
},
新项目{
Id=3,
库存=新列表{
新的ItemInv(){wid=3}
} };
//输出:
//wid 2-项目id=1,项目id=2
//wid 3-项目id=2,项目id=3

查看当前分组是按
inv.wid
进行的。如果希望通过
ItemInv
实例进行分组,则必须首先覆盖
Equals
GetHashCode

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

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

但是您希望如何对具有多个
ItemInv
项目进行分组?按wid字段在不同组中的一个对象在同一
库存
列表中是否存在重复的
wid
值?注意:如果没有中间步骤,则无法执行此操作,因为您需要为
库存
列表中的每个项目“复制”一次对象(嗯,对对象的引用)。是的。我同意。Thnx.
z
y
x
都是糟糕的变量名。@ErikE同意,这很懒。编辑。值得一提的是,
Tuple
看起来不是值类型,因此使用
KeyValuePair
可能会有一些性能价值,因为每个值都可以在堆栈而不是堆上分配。