[C#]LINQ中如何按實體的某個屬性去重


NET[C#]LINQ中如何按實體的某個屬性去重后返回不重復的集合?

問題描述

比如有如下實體集合:

Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name="Test2" 

如何使用LINQ按 Person.Id 去重,返回的集合只包含 Person1Person3

方案一

創建一個靜態擴展類:

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) { if (seenKeys.Add(keySelector(element))) { yield return element; } } } 

調用方法:

var query = people.DistinctBy(p => p.Id); 

如果需要按多個屬性去重,則可以使用匿名對象,如:

var query = people.DistinctBy(p => new { p.Id, p.Name }); 

方案二

List<Person> distinctPeople = allPeople .GroupBy(p => p.PersonId) .Select(g => g.First()) .ToList(); 

多屬性去重:

List<Person> distinctPeople = allPeople .GroupBy(p => new {p.PersonId, p.FavoriteColor} ) .Select(g => g.First()) .ToList(); 

方案三

var uniquePeople = from p in people group p by new {p.ID} //or group by new {p.ID, p.Name, p.Whatever} into mygroup select mygroup.FirstOrDefault(); 

方案四

Persons.ToLookup(p => p.Id).Select(coll => coll.First());

方案五

var result = people.Where(p => !people.Any(q => (p != q && p.Id == q.Id))); 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM