自定义 LINQ 中 Distinct 的 Compare,以及扩展 LINQ 的 Distinct,让它支持属性比较
2011-05-03 16:25 音乐让我说 阅读(732) 评论(2) 编辑 收藏 举报直接贴代码:
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(); } } }
运行结果如下:
谢谢浏览!
作者:音乐让我说(音乐让我说 - 博客园)
出处:http://music.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。