繁体   English   中英

linq按所有属性分组

[英]linq group by all properties [duplicate]

我有一个对象列表,需要找出重复的对象。

public class MyObject
{
    public string A { get; set; }
    public string B { get; set; }
    public int C { get; set; }
}

var myObjectList = new List<MyObject>();
// ...
var duplicates = from myObject in myObjectList
                 group myObject by (myObject.A, myObject.B, myObject.C) into groupCounts
                 where groupCounts.Count() > 1
                 select groupCounts;

我的问题是:有没有一种快速的方法可以将所有公共属性放入by子句? 如果MyObject需要增加属性数量,则by子句将以一长串结束。

我尝试用let子句进行解构,但编译器给了我一些错误。

创建一个通用比较器:

public class MyObjectComparer : IEqualityComparer<MyObject>
{
    public bool Equals(MyObject a, MyObject b)
    {
        var properties = a.GetType().GetProperties();
        foreach (var prop in properties)
        {
            var valueOfProp1 = prop.GetValue(a);
            var valueOfProp2 = prop.GetValue(b);

            if (!valueOfProp1.Equals(valueOfProp2))
            {
                return false;
            }
        }

        return true;
    }

    public int GetHashCode(MyObject item)
    {
        return item.A.GetHashCode();
    }
}

并使用它:

var duplicates = myObjectList.GroupBy(t => t, new MyObject.MyObjectComparer()).Where(t => t.Count() > 1).Select(t => t.Key).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM