2

文字列のリストがあり、それらを注文したいと思います。

IEnumerable<String> strings = ...;
strings = strings.OrderBy(a => a);

私が得られないのは、そこにあるラムダ式a => aのポイントです。最初はこんな風に物件​​を引き出せて注文できると思っていました。

IEnumerable<Something> somethings = ...;
IEnumerable<String> strings = somethings.OrderBy(a => a.StringProperty);

しかし、それはコンパイルされません。だから、私はこのように行かなければなりません。

IEnumerable<Something> somethings = ...;
IEnumerable<String> strings = somethings.Select(a
  => a.StringProperty).OrderBy(a => a);

では、なぜOrderByコマンドでラムダ式を使用する必要があるのでしょうか?!

4

5 に答える 5

6

ラムダは、「注文したいもの」を示します。

人の集合をとり、誕生日順に並べると、誕生日の集合ではなく、人の集合になります。すなわち

IEnumerable<Person> people = ...;
IEnumerable<Person> sorted = people.OrderBy(a => a.DateOfBirth);

同様に、一連のSomethings を byで並べ替えてもStringProperty、一連のSomethings になります。

IEnumerable<Something> somethings = ...;
IEnumerable<Something> sorted = somethings.OrderBy(a => a.StringProperty);

場合によっては (非常に少ない)、実際に「物自体で注文する」ことを意味します。IEnumerable<string>これは通常、またはのようなものにのみ適用されるIEnumerable<int>ため、小さな不都合.OrderBy(x => x)は些細なことです。気になる場合は、この詳細を非表示にする拡張メソッドをいつでも作成できます。

于 2013-08-10T20:55:36.370 に答える
2

コレクションを注文しても、そのタイプは変更されないため、

IEnumerable<Something> somethings = ...; 
var strings = somethings.OrderBy(a => a.StringProperty);

IEnumerable<Something>タイプを変更するには、プロパティを選択する必要があります。

IEnumerable<String> strings = somethings
    .OrderBy(s => s.StringProperty)
    .Select(s => s.StringProperty);

では、なぜ OrderBy コマンドでラムダ式を使用する必要があるのでしょうか?!

Enumerable.OrderBy引数が必要なメソッドだからです。

于 2013-08-10T20:54:26.800 に答える
1

あなたはそれを選択していないので、それによって注文しています.

これを試して:

Console.WriteLine(string.Join(", ",
    new[] { new { Int = 1 }, new { Int = 2 }, new { Int = 0 }
    .OrderBy(a => a.Int));

Intこれにより、ランダムに並べられただけでなく、プロパティごとに並べられたリストが得られます。

これは、オブジェクト自体だけでなく、オブジェクトの任意のプロパティで注文できることを意味します。

于 2013-08-10T20:54:35.037 に答える