2013-02-12 24 views
1

我已經尋找解決這個問題的方法,雖然我發現類似的問題,但我找不到這個問題的答案。我概括了問題,但它去的東西如下:使用Linq時按原始索引重新排序

我有以下INT []

[423] 
[234] 
[5] 
[79] 
[211] 
[1001] 

我想使用LINQ僅選擇小於200或大於項300和由原始數組索引然後爲了使最終的陣列存在保證爲:

[423] 
[5] 
[79] 
[1001] 
+0

檢查http://stackoverflow.com/q/2410070/1080742 – spajce 2013-02-12 10:29:51

回答

1

LINQ to object保留了選擇順序,所以一個簡單的where子句可以完成這項工作。

Order Preservation in PLINQ

在PLINQ,我們的目標是在保持正確性最大限度地提高性能。查詢應儘可能快地運行,但仍會產生正確的結果。在某些情況下,正確性要求保留源序列的順序;然而,排序可能在計算上是昂貴的。因此,默認情況下,PLINQ不保留源序列的順序。在這方面,PLINQ類似於LINQ to SQL,但與LINQ to Objects不同,它不是,它保持訂購

但是,如果你願意,你可以選擇index的價值和以後使用OrderByindex

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(); 
1

當過濾與Enumerable.Where原始順序的對象被保留。 MSDN

LINQ到對象,並保留訂貨

幾聲。您可以將Where視爲foreach循環中的簡單過濾元素,它將按照與循環相同的順序逐個返回項目。就像這樣:

public IEnumerable<T> Where(this IEnumerable<T> sequence, Func<T,bool> predicate) 
{ 
    foreach(var item in sequence) 
     if (predicate(item)) 
      yield return item; 
} 

瞭解更多關於Jon blog

0

不需要做任何的排序,訂單將被維持原判。

var someInts = new int[] { 423, 234, 5, 79, 211, 1001 }; 
var filteredInts = someInts.Where(i => i < 200 || i > 300); 

// filteredInts = [423, 5, 79, 1001] 
+0

我似乎已經發現,當陣列是v.large有時爲了不保留。我的linq表達式非常複雜,但如果我能解決這個簡單的例子,那麼它解決了我的主要問題。 – Jaqq 2013-02-12 10:34:42