C# 按对象列表对列表进行分组
我有一个对象列表,我试图按其中一个对象列表进行分组 我尝试了以下代码,但它没有分组任何内容 我有一个myObj类型的列表,比如[obj1[],obj2[],obj3[],obj4[] 我试过了C# 按对象列表对列表进行分组,c#,linq,C#,Linq,我有一个对象列表,我试图按其中一个对象列表进行分组 我尝试了以下代码,但它没有分组任何内容 我有一个myObj类型的列表,比如[obj1[],obj2[],obj3[],obj4[] 我试过了 myObj.GroupBy( a => new { a.obj1}, a => new { a.obj2, a.obj3, a.obj4}) .Select(x => new myObj
myObj.GroupBy(
a => new { a.obj1},
a => new { a.obj2, a.obj3, a.obj4})
.Select(x => new myObj
{
obj1= x.Key.obj1,
obj2= x.SelectMany(l => l.obj2).Distinct().ToList(),
obj3= x.SelectMany(list => list.obj3).Distinct().ToList(),
obj4= x.SelectMany(list => list.obj4).Distinct().ToList(),
}
)
.ToList();
但它的输出与myObj相同
e、 g
我想要输出:
myGroupedObj = [
{[a1],[a2,b2,c2,d2,e2],[e2,e3],[f4,g4]},
{[a2,a1],[d2,e2],[e3],[f4]},
{[a2],[a2,d2,e2],[e3,f3],[f4,g4]},
]
在任何情况下,问题都是您的KeySelector。 您选择的键是“a=>new{a.obj1}”。因此,对于每个项,您都会创建一个键的新实例。因为没有相等比较器重载,所以唯一的比较是引用相等。 键选择器必须返回实例,其中GroupBy方法可以执行“==”操作,realy获得相同的值 我无法复制您的示例,因此我无法验证这是否是唯一的问题,但在任何情况下,您的KeySelector应该是:
a=>a.obj1
当然,您必须将Select语句中的第一个赋值更改为
obj1=x.Key,
在任何情况下,问题在于您的KeySelector。
您选择的键是“a=>new{a.obj1}”。因此,对于每个项,您都会创建一个键的新实例。因为没有相等比较器重载,所以唯一的比较是引用相等。
键选择器必须返回实例,其中GroupBy方法可以执行“==”操作,realy获得相同的值
我无法复制您的示例,因此我无法验证这是否是唯一的问题,但在任何情况下,您的KeySelector应该是:a=>a.obj1
当然,您必须将Select语句中的第一个赋值更改为
obj1=x.Key,
您需要一个自定义比较器,请参阅link@mjwills posted
自定义比较器示例:
public class ListComparer : IEqualityComparer<List<object>>
{
public bool Equals(List<object> a, List<object> b)
{
if (a.Count != b.Count)
return false;
for (int i = 0; i < a.Count; i++)
if (a[i] != b[i])
return false;
return true;
}
public int GetHashCode(List<object> list)
{
var hash = 0;
foreach (var item in list)
{
hash = hash ^ item.GetHashCode();
}
return hash;
}
}
您需要自定义比较器,请参阅链接@mjwills 自定义比较器示例:
public class ListComparer : IEqualityComparer<List<object>>
{
public bool Equals(List<object> a, List<object> b)
{
if (a.Count != b.Count)
return false;
for (int i = 0; i < a.Count; i++)
if (a[i] != b[i])
return false;
return true;
}
public int GetHashCode(List<object> list)
{
var hash = 0;
foreach (var item in list)
{
hash = hash ^ item.GetHashCode();
}
return hash;
}
}
如果你能提供一个。请确保在代码中定义了示例输入,并明确提到您试图生成的确切结果。如果您能够提供。请确保在代码中定义了示例输入,并明确提及您试图生成的确切结果。
唯一的比较是参考相等。
此答案不是100%正确。我建议不要投赞成票。请参阅我提供的链接。唯一的比较是reference equal。
这个答案不是100%正确。我建议不要投赞成票。请看我提供的链接。我做了一些类似的事情,它按照我的预期工作@mjwills linked帮助我理解了为什么需要定制比较器。谢谢!我做了一些类似的事情,结果正如我预期的那样@mjwills linked帮助我理解了为什么需要定制比较器。谢谢!
myObjs
.GroupBy(a => a.obj1, new ListComparer())
.Select(x => new myObj
{
obj1 = x.Key,
obj2 = x.SelectMany(l => l.obj2).Distinct().ToList(),
obj3 = x.SelectMany(list => list.obj3).Distinct().ToList(),
obj4 = x.SelectMany(list => list.obj4).Distinct().ToList(),
})
.ToList();