10

重複の可能性:
LINQで順序を保持する

次のPersonクラスがあり、さらに次の配列を宣言するために使用されているとしPersonます。

public class Person
{
    public int Id { get;set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

var persons = new[] {
    new Person { Id = 1, Name = "John", Age = 40 },
    new Person { Id = 2, Name = "John", Age = 30 },
    new Person { Id = 3, Name = "John", Age = 35 },
};

次のLINQ拡張メソッドを使用してAge、の配列からを抽出します。PersonSelect

var ages = persons.Select(p => p.Age).ToArray;

LINQは、ages配列が次の順序になるように、派生配列内のアイテムの順序がソース配列内のアイテムの順序と一致することを保証しますか?

40
30
35
4

5 に答える 5

12

LINQ to Objects 演算子は、実際には元のデータ ソースを変更しません。データ ソースによって効果的にサポートされるシーケンスを構築します。順序を変更する唯一の操作は、OrderBy/OrderByDescending/ThenBy/ ThenByDescending です。その場合でも、それらは同じ順序の要素に対して安定しています。もちろん、多くの操作では一部の要素が除外されますが、返される要素は同じ順序になります。

Jon Skeet の回答 hereから。

IEnumerable を返す各操作の内訳は、同じ質問のさらに下にあります: https://stackoverflow.com/a/204777/128217

于 2013-01-17T13:45:39.403 に答える
6

Select()順序を維持します。それは完全にそうです。Distinct()ToDictionary()およびを使用するときは注意してくださいToLookup()

于 2013-01-17T13:45:44.313 に答える
2

これは、使用するオブジェクトと拡張メソッドによって多少異なります。型の概要と期待できることをまとめた投稿を次に示します。LINQ で順序を保持する

于 2013-01-17T13:44:48.347 に答える
1

もちろん!

項目は、リストにある順序で処理されます。

于 2013-01-17T13:45:46.880 に答える
0

ほとんどの場合、Select は列挙型を受け取り、各要素に順番に操作を適用します。

次のように考えることができます。

public static class Linq
{
    // We take in some data structure that supports enumeration and some function to apply to each element.
    public static IEnumerable<TResult> Select<T, TResult>(this IEnumerable<T> source, Func<T, TResult> operation)
    {
        foreach (var item in source)
        {
            // Here we simply return the next element
            // when the caller wants an item.
            yield return operation(item);
        }
    }
}
于 2013-01-17T13:51:44.293 に答える