static void Main(string[] args)
{
List<User> userList = new List<User>
{
new User{ Name ="张三", Adress ="xxxxxxxxxxxxxxxxx" },
new User{ Name ="张三", Adress ="yyyyyyyyyyy" },
new User{ Name ="李四", Adress ="ooooooooooooo" },
};
#region 单个集合去重
#region Distinct
var list = userList.Distinct(); //返回三条数据,默认是比较User对象的引用 所以比较不出来
//正确的方式如下(新建类UserNameComparer,继承 IEqualityComparer<User>,实现Equals方法)
List<User> listUser1 = userList.Distinct(new UserNameComparer()).ToList();
for (int i = 0; i < listUser1.Count; i++)
{
Console.WriteLine($"Name:{listUser1[i].Name} Adress:{listUser1[i].Adress}");
}
Console.WriteLine("=======================================================");
#endregion
#region FindIndex 推荐
List<User> listUser2 = userList.Where((x, i) => userList.FindIndex(z => z.Name == x.Name) == i).ToList();
for (int i = 0; i < listUser2.Count; i++)
{
Console.WriteLine($"Name:{listUser2[i].Name} Adress:{listUser2[i].Adress}");
}
Console.WriteLine("=======================================================");
#endregion
#region 通过循环方式去重 Exists
List<User> listUser3 = new List<User>();
foreach (User user in userList)
{
if (listUser3.Exists(x => x.Name == user.Name) == false)
{
listUser3.Add(user);
}
}
for (int i = 0; i < listUser3.Count; i++)
{
Console.WriteLine($"Name:{listUser3[i].Name} Adress:{listUser3[i].Adress}");
}
Console.WriteLine("=======================================================");
#endregion
#endregion
Console.ReadKey();
}
public class User
{
public string Name { get; set; }
public string Adress { get; set; }
}
public class UserNameComparer : IEqualityComparer<User>
{
public bool Equals(User x, User y)
{
if (null == x)
return y == null;
return x.Name == y.Name;
}
public int GetHashCode(User obj)
{
if (null == obj)
return 0;
return obj.Name.GetHashCode();
}
#region 多个集合去重 (Union)
建立对User对象集合的Union关系(应用我们自定义的EntityComparer):
IEnumerable<User> list1 = new List<User> { new User { ID = "0003", Name = "张三", Grade = "高三" }, new User { ID = "0002", Name = "王二", Grade = "高三" } };
IEnumerable<User> list2 = new List<User> { new User { ID = "0003", Name = "张三", Grade = "高三" }, new User { ID = "0004", Name = "李四", Grade = "高二" } };
IEqualityComparer<User> ec = new EntityComparer();
//1:直接应用Union的重装方法 //IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
IEnumerable<User> users1 = list1.Union(list2,ec).OrderBy(c=>c.ID); //IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
//2:使用Concat,然后再使用distinct方法
IEnumerable<User> users2 = list1.Concat(list2).Distinct(ec).OrderBy(c => c.ID); foreach (User item in users2)
Console.WriteLine("ID:{0,-7}Name:{1,-5}Grade:{2}", item.ID, item.Name, item.Grade);
/*结果
ID = "0002", Name = "王二", Grade = "高三"
ID = "0003", Name = "张三", Grade = "高三"
ID = "0004", Name = "李四", Grade = "高二"
*/
#endRegion
}
浙公网安备 33010602011771号