2010-02-24 88 views
1

我有一個C#應用程序,它加載名爲「任務」的CLR對象列表。每個任務都有以下屬性:LINQ獨特查詢

public int ID { get; set; } 
public int TypeID { get; set; } 
public string TypeName { get; set; } 
public string Name { get; set; } 

我正試圖在此列表中找到唯一類型的任務。我想我會嘗試使用LINQ來做到這一點。但是,我無法弄清楚如何去做。我怎麼說給我所有的這個列表中唯一的TypeID和TypeName?目前,我正在嘗試以下方法,讓我不在哪裏。事實上,它甚至還會編譯。

var uniqueTasks = allTasks.Distinct(p => p.TypeID); 

謝謝

+0

你想在不同的任務或不同類型的? – SLaks 2010-02-24 19:41:56

+2

是否需要不同類型ID的列表以及不同類型名稱的列表或不同類型列表的類型ID,類型名稱? – user76035 2010-02-24 19:42:53

回答

6

讓我知道我理解這個問題:你有一個名爲allTask​​s任務的順序,你想不重複的所有ID序列,是嗎?

變換的任務的順序爲ID的序列:

var ids = allTasks.Select(p=>p.TypeId); 

現在你有ID的序列。您希望從該序列中篩選出重複項:

var distinctIds = ids.Distinct(); 

然後就完成了。那是你之後的事情嗎?

+0

這是一個很酷的方式來做到這一點。但是'var ids'或'var distinctIds'是'int'的列表。而不是被稱爲「任務」的「對象」的原始列表。如果我想用'TypeName'等'Task'來使用其他的東西呢?我需要再次查詢組織清單以獲取必要的信息。 – william 2012-10-09 08:21:33

2

你需要實現自己的比較器:

public class TaskComparer : IEqualityComparer<Task> 
{ 

    #region IEqualityComparer<Task> Members 

    public bool Equals(Task x, Task y) 
    { 
     return x.TypeID == y.TypeID && x.TypeName == y.TypeName; 
    } 

    public int GetHashCode(Task obj) 
    { 
     return obj.TypeID.GetHashCode() + obj.TypeName.GetHashCode(); 
    } 

    #endregion 
} 

然後使用它是這樣的:

var uniqueTasks = allTasks.Distinct(new TaskComparer()); 

編輯:砍死了一些GetHashCode()方法感謝Slaks誰指出的GetHashCode是絕對必要的(我想它在內部建立一個HashTable)

+0

錯誤錯誤! **您必須執行'GetHashCode'!** – SLaks 2010-02-24 19:42:32

+0

真的嗎?爲什麼? – BFree 2010-02-24 19:43:29

+0

因爲否則,它將完全無用。 – SLaks 2010-02-24 19:44:27

3

最簡單的方法是使用GroupBy

var uniqueTasks = allTasks.GroupBy(p => p.TypeID); 

這會給你一組映射TypeID與該ID的任務分組。

如果你想一組任務,你可以寫

var uniqueTasks = allTasks.GroupBy(p => p.TypeID).Select(g => g.First()); 
1
var uniqueTasks = allTasks.Select(t=>t.TypeName).Distinct().ToList(); 
+0

t => t.TypeName;) – user76035 2010-02-24 19:46:00

+0

@wwosik ...謝謝...我真的應該閱讀我發佈的內容... – 2010-02-24 19:48:23