Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按对象列表对列表进行分组_C#_Linq - Fatal编程技术网

C# 按对象列表对列表进行分组

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类型的列表,比如[obj1[],obj2[],obj3[],obj4[]

我试过了

 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();