c# - LINQ在特定屬性上的Distinct()




linq to sql distinct (12)

如果我想根據一個多個屬性獲取不同的列表, 怎麼辦?

簡單! 你想將他們分組並從組中選出一個優勝者。

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();

我正在玩LINQ來了解它,但是當我沒有一個簡單的列表(一個簡單的整數列表很容易做,這不是問題)時,我無法弄清楚如何使用Distinct。 我如果想在對象的一個多個屬性上使用Distinct

例如:如果一個對Person ,並帶有Property Id 。 我如何獲得所有人並使用對象的屬性Id對他們使用Distinct

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

我怎樣才能得到Person1和Person3? 那可能嗎?

如果LINQ不可能,取決於.NET 3.5中某些屬性的最佳方法是什麼?


編輯 :這現在是MoreLINQ一部分。

你需要的是一個“獨特的”有效的。 我不認為它是LINQ的一部分,儘管它很容易編寫:

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;
        }
    }
}

因此,要使用Id屬性查找不同的值,可以使用:

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

為了使用多個屬性,可以使用匿名類型,它們可以適當地實現相等性:

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

未經測試,但它應該工作(現在至少編譯)。

它假設鍵的默認比較器 - 如果你想傳入一個相等比較器,只需將它傳遞給HashSet構造器。


你也可以使用查詢語法,如果你想讓它看起來像所有LINQ一樣:

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();

你可以用標準的Linq.ToLookup()來做到這一點。 這將為每個唯一密鑰創建一個值的集合。 只需選擇集合中的第一個項目

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

使用:

List<Person> pList = new List<Person>();
/* Fill list */

var result = pList.Where(p => p.Name != null).GroupBy(p => p.Id).Select(grp => grp.FirstorDefault());

groupby可以幫助您過濾條目(可能更複雜), groupbyselect可以執行不同的功能。


先解決你的領域的解決方案,然後選擇first或default項目。

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

如果您需要對多個屬性使用Distinct方法,則可以查看我的PowerfulExtensions庫。 目前它處於一個非常年輕的階段,但已經可以使用像Distinct,Union,Intersect等方法,除了任何數量的屬性外;

這是你如何使用它:

using PowerfulExtensions.Linq;
...
var distinct = myArray.Distinct(x => x.A, x => x.B);

您應該可以覆蓋Equals on Person,以實際上在Person.id上執行Equals。 這應該導致你以後的行為。


我寫了一篇文章,解釋如何擴展Distinct函數,以便您可以執行以下操作:

var people = new List<Person>();

people.Add(new Person(1, "a", "b"));
people.Add(new Person(2, "c", "d"));
people.Add(new Person(1, "a", "b"));

foreach (var person in people.Distinct(p => p.ID))
    // Do stuff with unique list here.

這裡是文章: 擴展LINQ - 在不同功能中指定一個屬性


我認為這足夠了:

list.Select(s => s.MyField).Distinct();


List<Person>lst=new List<Person>
        var result1 = lst.OrderByDescending(a => a.ID).Select(a =>new Player {ID=a.ID,Name=a.Name} ).Distinct();




distinct