Listedeki farklı değerlerin bir listesini alma


175

C #, üç String üye değişkenleri ile Not adlı bir sınıf var diyelim.

public class Note
{
    public string Title;
    public string Author;
    public string Text;
}

Ve Not türü bir listesi var:

List<Note> Notes = new List<Note>();

Yazar sütunundaki tüm farklı değerlerin bir listesini almanın en temiz yolu ne olurdu?

Liste üzerinden yineleme ve dizeleri başka bir listesine yinelenmeyen tüm değerleri eklemek olabilir, ama bu kirli ve verimsiz görünüyor. Bunu bir satırda yapacak sihirli bir Linq yapısı olduğunu hissediyorum, ama hiçbir şey bulamadım.

Yanıtlar:


332
Notes.Select(x => x.Author).Distinct();

Bu, benzersiz değer başına bir değer dizisi ( IEnumerable<string>) döndürür Author.


1
Notlar (x => x.Yazar) .AsParallel (). Distinct (); "AsParallel ()", siparişle ilgilenmezsek ve listede daha fazla öğe varsa, bazı performans avantajları sağlayabilir.
Sai

1
@Kiquenet, Defaulteşitlik karşılaştırıcısını göz önünde bulundurarak ayrı . msdn.microsoft.com/tr-tr/library/bb348436(v=vs.110).aspx
Georg Patscheider

.Distinct () öncesine ToList () eklememiz gerekiyor mu?
Phan Đức Bình

1
Distinct () önce değil, sonra bir listeye dönüştürmeye çalışıyorsanız. Örn: Notlar. (X => x.Yazar) .Distinct (). ToList ();
MTwiford

87

Yazarın Not sınıfını ayırt etme

var DistinctItems = Note.GroupBy(x => x.Author).Select(y => y.First());

foreach(var item in DistinctItems)
{
    //Add to other List
}

1
Olması gerekmez mi Notesgibi Notes.GroupBy()bir çoğul ile solduğu gibi Notesadece bir tek Not yapacak?
kkuilla

30

Jon Skeet, operatörü olan morelinq adlı bir kütüphane yazmıştır DistinctBy(). Uygulama için buraya bakınız . Kodunuz şöyle görünür

IEnumerable<Note> distinctNotes = Notes.DistinctBy(note => note.Author);

Güncelleme: Sorunuzu yeniden okuduktan sonra, sadece farklı bir dizi Yazar arıyorsanız Kirk doğru cevabı verir.

DistinctBy'de birkaç alan örneği eklendi:

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();

Harika teşekürler. Distinct yöntemini çağırmadan önce listeyi sipariş edersem doğru siparişi tutmayı seviyorum.
Vilhelm

Bağlantıları güncelledim. LINQ artık Github'da ve Nuget üzerinden kurulabilir:Install-Package morelinq
Chad Levy

2
public class KeyNote
{
    public long KeyNoteId { get; set; }
    public long CourseId { get; set; }
    public string CourseName { get; set; }
    public string Note { get; set; }
    public DateTime CreatedDate { get; set; }
}

public List<KeyNote> KeyNotes { get; set; }
public List<RefCourse> GetCourses { get; set; }    

List<RefCourse> courses = KeyNotes.Select(x => new RefCourse { CourseId = x.CourseId, Name = x.CourseName }).Distinct().ToList();

Yukarıdaki mantığı kullanarak benzersiz Courses'yi elde edebiliriz .


ToList önce senin farklı zamanımı kurtarmak .. Ben ToList sonra yapıyorum ve listeyi Ienumerable dönüştürmek olamaz hata verir.
Ajay2707

Burada farklı olmayacaktır çünkü bu operatör için her nesne, nesnenin hashcode'una dayalı olarak benzersizdir. Buna benzer bir şeye
Bose_geek

-2
mcilist = (from mci in mcilist select mci).Distinct().ToList();

MCI tam olarak nedir? Sadece bir örnek tablo mu? Cevap olduğu gibi biraz garip.
Brad Koch

1
Evet, bunun orijinal sorumun aradığı şeyi yaptığını sanmıyorum (bir buçuk yıl önce ve proje bittiğinden beri uzun süredir aldırmayın). Ne söyleyebilirim ki, zaten yinelenenleri içerebilir, ancak yazar dize alanlarından biri olan nesneler listesinden böyle bir liste ayıklamak için kullanılamaz zaten bir dizi yazar dizeleri vardı, bu işe yarayacak.
Darrel Hoffman
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.