C# LINQ,GroupBy具有对象类型的字段的内部值
是否可以按内部属性值对集合进行分组?如何在不使用Linq创建新对象的情况下执行此操作。或者我需要在分组过程之前创建匿名对象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
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
可能会有一些性能价值,因为每个值都可以在堆栈而不是堆上分配。