c# - Linq 除了自定义 IEqualityComparer

标签 c# linq-to-objects iequalitycomparer

我正在尝试找出两个通用列表之间的区别,如下例所示。 尽管 t1 和 t2 包含相同的属性,但它们不是同一个对象,因此我需要实现一个 IEqualityComparer。

这似乎适用于此示例,但实际类还有其他几个属性,我还需要对其他一些类执行相同的操作。

所以我想知道我是不是在重新发明轮子?

是否有更简单的方法来比较两个对象的所有属性?目前,我真的只需要处理包含简单类型的类,但如果我有一个比较器可以处理包含其他类实例的类,那就太好了。

void Main()
{
    var t1 = new Sizes { Name = "Test" , Size = 1} ;
    var t2 = new Sizes { Name = "Test" , Size = 1} ;

    var list1 = new List<Sizes>();
    var list2 = new List<Sizes>();
    list1.Add(t1);
    list2.Add(t2);

    var differences = list2.Except(list1 , new SizesComparer());    
    // differences should be empty.
}


public class Sizes  
{
    public string Name { get;  set; }
    public int    Size { get;  set; }
}

public class SizesComparer : IEqualityComparer<Sizes>   
{
    bool IEqualityComparer<Sizes>.Equals(Sizes x, Sizes y)
    {            
        return (x.Name.Equals(y.Name) && x.Size.Equals(y.Size));        
    }

    int IEqualityComparer<Sizes>.GetHashCode(Sizes obj)
    {
        if (Object.ReferenceEquals(obj, null))
            return 0;               

        return obj.Name.GetHashCode() + obj.Size;       
    }
}

最佳答案

你可以尝试这样的事情:

var differences = list2.Where(l2 => 
    !list1.Any(l1 => l1.Name == l2.Name && l1.Size == l2.Size));

或者如果你愿意:

var differences = list2.Where(l2 => 
    list1.All(l1 => l1.Name != l2.Name || l1.Size != l2.Size));

关于c# - Linq 除了自定义 IEqualityComparer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7042090/

相关文章:

c# - 通过动态属性将两个通用列表相交

c# - Distinct 不使用 LINQ to Objects

c# - 为什么 asp.NET 配置文件的设计方式如此糟糕?

c# - 如何在sql查询中使用逗号分隔的动态字符串?

.net - 您最喜欢的LINQ到对象的查询

c# - 使用 LINQ 从树数据结构中获取级别的最佳方法是什么?

c# - 如何通过进程ID设置滚动文件名唯一

c# - 应用泛型方法的错误

c# - .where(...).Any() 与 ..Any(...) 之间的性能差异

c# - 在 C# 中比较两个 List<MyClass>