标签:Name C# List LINQ Id static var new public
问题描述
使用LINQ如何实现对以上List集合的去
比如有如下的List集合: 1 Item1 IT00001 $100 2 Item2 IT00002 $200 3 Item3 IT00003 $150 1 Item1 IT00001 $100 3 Item3 IT00003 $150
重操作,具体实现有哪些呢?
方案一
var distinctItems = items.Distinct();
如果需要对泛型实体中的部分属性进行去重操作,则可以创建一个自定义的比较器:
class DistinctItemComparer : IEqualityComparer<Item> { public bool Equals(Item x, Item y) { return x.Id == y.Id && x.Name == y.Name && x.Code == y.Code && x.Price == y.Price; } public int GetHashCode(Item obj) { return obj.Id.GetHashCode() ^ obj.Name.GetHashCode() ^ obj.Code.GetHashCode() ^ obj.Price.GetHashCode(); } }
调用方法:
var distinctItems = items.Distinct(new DistinctItemComparer());
方案二
var distinctItems = items.GroupBy(x => x.Id).Select(y => y.First());
方案三
使用 MoreLinq 组件:
var distinct = items.DistinctBy( i => i.Id );
方案四
var query = collection.GroupBy(x => x.title).Select(y => y.FirstOrDefault());
方案五
创建静态扩展方法,如:
public static class DistinctHelper { public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { var identifiedKeys = new HashSet<TKey>(); return source.Where(element => identifiedKeys.Add(keySelector(element))); } }
调用方法:
var outputList = sourceList.DistinctBy(x => x.TargetProperty);
其中 x.TargetProperty
请替换成类对应的属性。
示例程序:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var people = new List<Person> { new Person {Id=1,Name="Curry",Age=26 }, new Person {Id=1,Name="Curry",Age=26 }, new Person {Id=3,Name="James",Age=27 }, new Person {Id=4,Name="Kobe",Age=38 } }; var distinctPeople = people.DistinctBy(x => x.Name).ToList(); distinctPeople.ForEach(x => Console.WriteLine($"Id:{x.Id},Name:{x.Name},Age:{x.Age}") ); Console.ReadKey(); } } public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } public static class DistinctHelper { public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { var identifiedKeys = new HashSet<TKey>(); return source.Where(element => identifiedKeys.Add(keySelector(element))); } } }
方案六
public static class DistinctHelper { public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { var identifiedKeys = new HashSet<TKey>(); foreach (var item in source) { if (identifiedKeys.Add(keySelector(item))) yield return item; } } }
标签:Name,C#,List,LINQ,Id,static,var,new,public 来源: https://www.cnblogs.com/huangshuqiang/p/13667933.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。