C# 如何在合并2个列表后消除重复项<;T>;

C# 如何在合并2个列表后消除重复项<;T>;,c#,C#,如果两个列表中的Name\Type对相同,我想删除结果列表中的一组项。我看到了联合,但它不起作用。这是给所有4个项目 var data1 = new List<Data> { new Data{Name = "N1", Type = "T1"}, new Data{Name = "N2", Type = "T2"}, }; var data2 = new List<Data>

如果两个列表中的
Name\Type
对相同,我想删除结果列表中的一组项。我看到了
联合
,但它不起作用。这是给所有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();

以下是您应该如何实现和使用比较器:

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();
    }
}
类程序
{
静态void Main()
{
列表狗=新列表(){
新狗
{
年龄=1岁,
Name=“Fuffy”
},
新狗
{
年龄=1岁,
Name=“Fuffy”
},
新狗
{
年龄=10岁,
Name=“比萨饼”
}
};
var结果=dogs.Distinct(新的DogEqualityComparer()).ToList();
}
}
公家犬
{
公共字符串名称{get;set;}
公共整数{get;set;}
}
公共类DogEqualityComparer:IEqualityComparer
{
公共布尔等于([AllowNull]狗x,[AllowNull]狗y)
{
返回x?.Age==y?.Age&&x?.Name==y?.Name;
}
public int GetHashCode([DisallowNull]Dog obj)
{
返回值(obj.Name?.GetHashCode()??0)+obj.Age.GetHashCode();
}
}

我认为hashset更合适,如果您正确实现hashcode和equals,union和distinct操作也会起作用。如果我没有错的话,您必须查看
IEquatable
接口。我想这很容易出现空引用异常,如果
AllowNull
@HasanEmrahSüngü您是对的,添加了空处理
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();
    }
}