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