2012-04-21 40 views
103

在C#中,假設我有一個名爲Note的類,其中包含三個String成員變量。獲取列表中不同值的列表

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

而且我有注意類型的列表:

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

什麼會得到在作者列中所有不同值的列表,最徹底的方法?

我可以遍歷列表並添加所有不重複的值到另一個字符串列表,但這看起來很髒並且效率低下。我有一種感覺,有一種神奇的Linq結構可以做到這一點,但我一直無法提出任何想法。

回答

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

這將返回Author值的序列(IEnumerable<string>) - 每個唯一值之一。

+0

Notes.Select(x => x.Author).AsParallel()。Distinct();如果我們不關心訂單並在列表中包含更多項目,「AsParallel()」可能會帶來一些性能優勢。 – Sai 2015-10-22 20:58:59

+1

@Kiquenet,考慮到'Default'相等比較器。 https://msdn.microsoft.com/zh-cn/library/bb348436(v=vs.110).aspx – 2016-01-21 23:01:06

+0

是否需要在.Distinct()之前添加ToList()? – 2017-01-05 01:44:29

24

Jon Skeet寫了一個名爲morelinq的庫,它有一個DistinctBy()操作符。有關實現請參見here。您的代碼看起來像

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

更新:重新閱讀您的問題 後,柯克具有正確的答案,如果你只是在尋找一組不同的作者。

新增樣本,有幾個字段在DistinctBy:

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

https://code.google.com/p/morelinq/source/browse/trunk/MoreLinq/DistinctBy.cs 404錯誤 – Kiquenet 2014-04-03 09:51:03

+0

已更新DistinctBy源的鏈接。 – 2014-04-03 11:34:28

+0

非常好,謝謝。我喜歡它保持正確的順序,如果我在調用Distinct方法之前命令列表。 – Vilhelm 2017-10-05 15:52:18

-1
mcilist = (from mci in mcilist select mci).Distinct().ToList(); 
+0

mci是什麼?只是一個示例表?答案有點尷尬。 – 2013-10-09 21:47:49

+0

是的,我不認爲這是我最初的問題尋找(不要介意它是一年半前,該項目是自完成以來很長)。從我所知道的情況來看,如果我已經有一個可能包含重複項的作者字符串列表,但無法用來從作爲其字段之一的作者字符串的對象列表中提取這樣的列表,那麼這將工作。 – 2013-10-10 04:41:47

40
var DistinctItems = employees.GroupBy(x => x.EmpID).Select(y => y.First()); 

foreach(var item in DistinctItems) 
{ 
    //Add to other List 
} 
0
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(); 

使用上述邏輯,我們可以獨特的課程。