2014-01-18 17 views
1

我有這樣的代碼:爲什麼LINQ不讓我OrderBy作爲我的一個數據點?

return inventoryItems 
    .Where(i => 0 < String.Compare(i.ID, ID)) 
    .Take(CountToFetch); 

...但我要訂購的結果,就像這樣:

return inventoryItems 
    .Where(i => 0 < String.Compare(i.ID, ID)) 
    .Take(CountToFetch) 
    .OrderBy(i.pksize); 

......然而,最終i紅/超出範圍。爲什麼?試圖在Take()之前定位OrderBy()沒有區別。

+1

是什麼阻止你重新定義它? '返回inventoryItems.Where(i => 0 i.pksize);' –

+4

'OrderBy(i => i.pksize) ;'? http://msdn.microsoft.com/en-us/library/bb397687.aspx –

+1

哈哈,我懷疑,也許你已經很晚了,在這一點上,可能應該睡覺:) – theMayer

回答

6
return inventoryItems.Where(i => 0 < String.Compare(i.ID, ID)) 
        .Take(CountToFetch) 
        .OrderBy(i => i.pksize); 

也許你應該改變OrderByTake爲了使結果可以預見的:

return inventoryItems.Where(i => 0 < String.Compare(i.ID, ID)) 
        .OrderBy(i => i.pksize) 
        .Take(CountToFetch); 
+1

好點'採取' 。它可能是第一個是真正想要的,但是第二個更常見。 –

3

有一個在OrderBy沒有i

你想OrderBy(i => i.pksize)(或實際上x => x.pksizewhatever => whatever.pksize等)

排序語法,允許from x in something where x.IsOkay orderby x.Priority等通過使用相同的變量標籤的所有方法,但它被變成了一個以上的lambda表達式,它們彼此分開。 (something.Where(x => x.IsOkay).OrderBy(x => x.Priority),但他們需要每個都是完整的表達式

1

看起來你已經嘗試使用Where中聲明的i如果你仔細觀察括號,你會發現它實際上已經不在在OrderBy內的範圍。因此,第一個問題是你試圖使用超出範圍的一個變量。

OrderBy實際上需要能夠檢查在IEnumerable每個元素的屬性,因此它不只有通過它的值一個元素的屬性,它需要知道如何得到屬性f或每個元素,這就是爲什麼你通常會傳入一個lambda表達式,匿名委託或方法。

正如有人指出,你可以通過使用lambda表達式就像你在Where解決了問題:

.OrderBy(i => i.pksize) 
+0

是的,我已經做到了;這就是爲什麼我將馬辛的答案標記爲correctomundo。 –

+0

@ B.ClayShannon這個答案沒有解決你的問題:「爲什麼?」。 – Sam

+0

夠公平的;謝謝! –

相關問題