1

この問題の解決策を探してみましたが、同様のことがわかりましたが、この特定の問題に対する答えが見つかりませんでした。問題を一般化しましたが、次のようになります。

私は次のint []を持っています

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

linq を使用して、200 未満または 300 を超えるエントリのみを選択し、元の配列インデックスで並べ替えて、最終的な配列が次のようになることを保証したいと思います。

[423]
[5]
[79]
[1001]
4

3 に答える 3

1

Enumerable.Where元の順序でオブジェクトをフィルタリングすると、保持されます。MSDN :

LINQ to Objects、順序を保持します

あと少し。foreach ループの単純なフィルタリング要素と考えることができますWhere。これは、アイテムがループに入るのとまったく同じ順序でアイテムを 1 つずつ返します。このような:

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

詳細については、ジョンのブログをご覧ください。

于 2013-02-12T10:30:01.393 に答える
1

LINQ to object は選択の順序を保持するため、単純な where 句で機能します。

PLINQ での順序の保持

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();
于 2013-02-12T10:30:14.653 に答える
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]
于 2013-02-12T10:30:40.513 に答える