合并两个列表后如何消除重复项<T>

时间:2020-10-14 08:29:46

标签: c#

如果两个Name\Type对在两个列表中都相同,我想在结果列表中删除一组项目。我看到了Union,但这是行不通的。它给出了所有4个项目。

var data1 = new List<Data>
{
    new Data{Name = "N1", Type = "T1"},
    new Data{Name = "N2", Type = "T2"},
};

var data2 = new List<Data>
{
    new Data{Name = "N1", Type = "T1"},
    new Data{Name = "N3", Type = "T3"},
};

var X = data1.Union(data2).Distinct().ToList();

结果应仅包含3个项目,

new Data{Name = "N1", Type = "T1"},
new Data{Name = "N2", Type = "T2"},
new Data{Name = "N3", Type = "T3"},

1 个答案:

答案 0 :(得分:1)

这是实现和使用比较器的方式:

class Program
{
    static void Main()
    {
        List<Dog> dogs = new List<Dog>() {
            new Dog
            {
                Age = 1,
                Name = "Fuffy"
            },
            new Dog
            {
                Age = 1,
                Name = "Fuffy"
            },
            new Dog
            {
                Age = 10,
                Name = "Pizza"
            }
        };

        var result = dogs.Distinct(new DogEqualityComparer()).ToList();
    }
}

public class Dog
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class DogEqualityComparer : IEqualityComparer<Dog>
{
    public bool Equals([AllowNull] Dog x, [AllowNull] Dog y)
    {
        return x?.Age == y?.Age && x?.Name == y?.Name;
    }

    public int GetHashCode([DisallowNull] Dog obj)
    {
        return (obj.Name?.GetHashCode() ?? 0) + obj.Age.GetHashCode();
    }
}