Nesneler listesinden benzersiz bir özellik listesi elde etmek için Linq'i nasıl kullanabilirim?


171

Kimliği bir özellik olduğu nesnelerin bir listesini verilen kimlikleri listesini döndürmek için Linq kullanmaya çalışıyorum. Bunu, her bir nesnenin içinde dolaşmadan ve bulduğum benzersiz kimlikleri çıkarmadan yapabilmek istiyorum.

MyClass türü nesnelerin bir listesi var ve bu sınıfın özelliklerinden biri bir kimlik.

public class MyClass
{
  public int ID { get; set; }
}

Ne yapmak istiyorum bana bu Ids bir listesini döndürmek için bir Linq sorgu yazmak

Kimlikleri IList<MyClass>bir döndürecek şekilde bunu nasıl yapabilirim IEnumerable<int>?

MyClass listesindeki her öğe arasında döngü ve benzersiz değerleri bir listeye eklemek yerine Linq kullanarak bir veya iki satırda yapmak mümkün olmalıdır eminim.

Zarif bir çözüm yaratmada herhangi bir yardım çok takdir edilecektir!


1
Ayrıca var unutmayın DistinctByiçinde MoreLinq size ayrı verecektir hangi MyClassdayalı s ID. Kullanım:var distincts = list.DistinctBy(x => x.ID);
nawfal

Yanıtlar:


319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();

Vaov! Bunun basit bir şey olduğunu düşündüm ... Sadece düşünemedim. Görünüşe göre Linq'le tanışmak için biraz daha zaman harcamam gerekecek.
mezoid

29

Farklı operatörü kullanın :

var idList = yourList.Select(x=> x.ID).Distinct();

5
(küçük adlandırma noktası; kimliklerin bir "listesi" değildir - tembel bir şekilde değerlendirilmiş IEnumerable <int> - .ToList (), tabii ki ;-p) demediğiniz sürece
Marc Gravell

@Marc, tembel eval 2 satır basit bir açıklama? Lütfen ve teşekkürler: D
masfenix

2
@masfenix Lazy eval, işlemin gerçekte kullanılana kadar yapılmadığı anlamına gelir. Bu durumda, bu cevaptaki ifade yürütüldüğünde kimliklerin seçilmesi ve sadece farklı olanların seçilmesi zorunlu değildir. Gerçekte idList içinden, örneğin bir foreach döngüsünde geçmeye başladığınızda yapılacaktır.
Mark Meuer

13

Uzatma ile düz Linq kullanma Distinct():

var idList = (from x in yourList select x.ID).Distinct();

3
        int[] numbers = {1,2,3,4,5,3,6,4,7,8,9,1,0 };
        var nonRepeats = (from n in numbers select n).Distinct();


        foreach (var d in nonRepeats)
        {

            Response.Write(d);
        }

ÇIKTI

1234567890


1
Soruyu cevaplamıyor ve cevaplasa bile yeni bir şey eklemiyor.
nawfal

2

Distinct'i alırken IEnumerable'a da girmek zorundayız. Liste model anlamına geliyorsa, böyle bir kod yazmanız gerekir

 IEnumerable<T> ids = list.Select(x => x).Distinct();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.