我已經尋找解決這個問題的方法,雖然我發現類似的問題,但我找不到這個問題的答案。我概括了問題,但它去的東西如下:使用Linq時按原始索引重新排序
我有以下INT []
[423]
[234]
[5]
[79]
[211]
[1001]
我想使用LINQ僅選擇小於200或大於項300和由原始數組索引然後爲了使最終的陣列存在保證爲:
[423]
[5]
[79]
[1001]
我已經尋找解決這個問題的方法,雖然我發現類似的問題,但我找不到這個問題的答案。我概括了問題,但它去的東西如下:使用Linq時按原始索引重新排序
我有以下INT []
[423]
[234]
[5]
[79]
[211]
[1001]
我想使用LINQ僅選擇小於200或大於項300和由原始數組索引然後爲了使最終的陣列存在保證爲:
[423]
[5]
[79]
[1001]
LINQ to object保留了選擇順序,所以一個簡單的where子句可以完成這項工作。
在PLINQ,我們的目標是在保持正確性最大限度地提高性能。查詢應儘可能快地運行,但仍會產生正確的結果。在某些情況下,正確性要求保留源序列的順序;然而,排序可能在計算上是昂貴的。因此,默認情況下,PLINQ不保留源序列的順序。在這方面,PLINQ類似於LINQ to SQL,但與LINQ to Objects不同,它不是,它保持訂購。
但是,如果你願意,你可以選擇index
的價值和以後使用OrderBy
上index
int[] array = new []
{
423,234,5,79,211,1001
};
var sortedArray = array.Select((r, i) => new { value = r, index = i })
.Where(t => t.value < 200 || t.value > 300)
.OrderBy(o => o.index)
.Select(s => s.value).ToArray();
不需要做任何的排序,訂單將被維持原判。
var someInts = new int[] { 423, 234, 5, 79, 211, 1001 };
var filteredInts = someInts.Where(i => i < 200 || i > 300);
// filteredInts = [423, 5, 79, 1001]
我似乎已經發現,當陣列是v.large有時爲了不保留。我的linq表達式非常複雜,但如果我能解決這個簡單的例子,那麼它解決了我的主要問題。 – Jaqq 2013-02-12 10:34:42
檢查http://stackoverflow.com/q/2410070/1080742 – spajce 2013-02-12 10:29:51