2013-04-30 48 views
1

我在加入兩個LINQ查詢時遇到問題。連接LINQ查詢和LINQ排序語句

目前,我(原)代碼看起來像這樣

s.AnimalTypes.Sort((x, y) => string.Compare(x.Type, y.Type)); 

什麼,我需要做的是改變此基礎上的日期,然後選擇此日期的所有數據,所以我有

s.AnimalTypes.Select(t=>t.DateChanged > dateIn).ToList() 
s.AnimalTypes.Sort((… 

這看起來不正確,因爲它沒有對選定的數據進行排序,而是排序s.AnimalTypes中的所有內容。

有沒有辦法連接兩條LINQ線?我試過

s.AnimalTypes.Select(t=>t.DateChanged > dateIn).ToList().Sort((… 

但這給了我一個排序部分的錯誤。

有沒有簡單的方法來做到這一點?我環顧四周,Grouo和OrderBy一直在出現,但我不確定這些是我需要的。

感謝

+0

什麼是錯誤? – agAus 2013-04-30 22:44:01

回答

1

從你的描述,我相信你想要的東西,如:

var results = s.AnimalTypes.Where(t => t.DateChanged > dateIn).OrderBy(t => t.Type); 

你可以打電話給ToList()如果需要轉換爲List<T>末。

有幾個基本概念我相信你在這裏失蹤 -

首先,與List<T>.Sort,LINQ的擴展方法不改變原有藏品,而是返回一個新的IEnumerable<T>與過濾或排序結果。這意味着你總是需要爲返回值分配一些東西(因此我的var results =以上)。

其次,Select執行映射操作 - 將數據從一種形式轉換爲另一種形式。例如,您可以使用它來提取出DateChangedSelect(t => t.DateChanged)),但這會給你一個枚舉日期,而不是原始動物類型。爲了使用謂詞(條件)過濾或限制列表,您應該使用Where來代替。

最後,您可以使用OrderBy對結果可枚舉進行重新排序。

+0

謝謝 - 你已經解釋了我錯誤的地方。代碼現在可以正常工作:) – Nodoid 2013-04-30 22:48:04

0

當您確實想要使用Where時,您正在使用Select

Select是從一個一個類型的集合爲另一種類型的投影 - 你會不會增加或使用Select減少集合中的項目數量,但可以改爲選擇每個對象的名稱或一些其他財產。

Where是你用來過濾基於布爾謂詞的集合。