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):

 #region 对象集合  

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
}

 

posted on 2018-06-22 13:23  初来乍到,多多指导  阅读(166)  评论(0)    收藏  举报