直接贴代码:
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConAppDistinct
{
class Program
{
static void Main(string[] args)
{
List<UserInfo> ltUserInfo = UserInfoService.GetAllUserInfo();
Console.WriteLine("默认调用的 Distinct 无参方法:");
IEnumerable<UserInfo> query1 = ltUserInfo.Where(u => u.Birthday.Year >= 1987).Distinct();
foreach (UserInfo item in query1)
{
Console.WriteLine(item.Id + "," + item.Name + "," + item.Birthday.ToString("yyyy-MM-dd"));
}
Console.WriteLine("=======================================================\n\n");
Console.WriteLine("调用实现了 IEqualityComparer<UserInfo> 的 Distinct 方法:");
UserInfoCompare userInfoCompare = new UserInfoCompare();
IEnumerable<UserInfo> query2 = ltUserInfo.Where(u => u.Birthday.Year >= 1987).Distinct(userInfoCompare);
foreach (UserInfo item in query2)
{
Console.WriteLine(item.Id + "," + item.Name + "," + item.Birthday.ToString("yyyy-MM-dd"));
}
Console.WriteLine("=======================================================\n\n");
Console.WriteLine("调用扩展的 Distinct 方法");
IEnumerable<UserInfo> query3 = ltUserInfo.Where(u => u.Birthday.Year >= 1987).DistinctBy(u => new{ u.Id,u.Name });
foreach (UserInfo item in query3)
{
Console.WriteLine(item.Id + "," + item.Name + "," + item.Birthday.ToString("yyyy-MM-dd"));
}
}
}
public static class EnumerableExtender
{
/* 参考 .NET 源码的实现,利用 .NET Reflector */
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
var elementValue = keySelector(element);
if (seenKeys.Add(elementValue))
{
yield return element;
}
}
}
}
public static class UserInfoService
{
public static List<UserInfo> GetAllUserInfo()
{
return new List<UserInfo>()
{
new UserInfo(){ Id = 1, Name = "张三", Birthday = new DateTime(1985,1,1) },
new UserInfo(){ Id = 2, Name = "李四", Birthday = new DateTime(1986,2,1) },
new UserInfo(){ Id = 3, Name = "王五", Birthday = new DateTime(1987,3,1) },
new UserInfo(){ Id = 4, Name = "赵六", Birthday = new DateTime(1988,4,1) },
new UserInfo(){ Id = 3, Name = "王五", Birthday = new DateTime(1989,5,1) }
};
}
}
public class UserInfo
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
public DateTime Birthday
{
get;
set;
}
}
public class UserInfoCompare : IEqualityComparer<UserInfo>
{
public bool Equals(UserInfo x, UserInfo y)
{
return (x.Id == y.Id && x.Name == y.Name);
}
public int GetHashCode(UserInfo obj)
{
// return obj.GetHashCode(); // GetHashCode()方法直接用obj.GetHashCode()的话,Distinct不能正常运行。
return obj.ToString().ToLower().GetHashCode();
}
}
}
运行结果如下:
谢谢浏览!