mrakdownで書きたいのでこちらにコメントします。
<WeponDate>
にIEnumerableという属性を付与していて
逆です。
たとえばList<int>
型のオブジェクトは「intをいくつでも(0個や1個もあり)入れられるオブジェクト」です。
クラスとしてはListであり、「型引数Tで指定した型のオブジェクトをいくつでも入れられる」となります。
クラスとしての実体はListの方で、型引数Tはどんな型のオブジェクトを入れられるのかを明示する追加情報です。
配列(Array)やList<T>
など「同じ型のオブジェクトがいくつも入っているオブジェクト」はIEnumerable<T>
インターフェイスを実装していて、引数の型がIEnumerable<T>
となっているメソッドの引数として渡せます。
IEnumerable<WeponDate>
というのは「どういう形で入っているかは決まってないけど、WeponDate型のオブジェクトがいくつも入っているオブジェクトで、その中身を一つずつ取り出すことができるもの」という意味になります。
OrderByで並べ替えできるということは、その対象は複数のWeponDate型オブジェクトだということですよね。(もしweponDatesの中身が0個や1個であっても「並べ替え前と後で同じもの」というだけなので並べ替え自体は行っても問題ありません)
int[] lst = {5, -3, -8, 0};//int[]はIEnumerable<int>でもある
foreach(var a in lst.OrderBy(
x => System.Math.Abs(x)//このラムダ式はkeySelectorという名前
))
{
Console.WriteLine(a);
}
上の例ではlstに4つの要素が入っているので、keySelectorは4回実行されます。
OrderByは「元のIEnumerable型のリストから要素を一つずつ取り出し、その要素一つずつに対してkeySelectorを実行、その返り値を見て昇順になるように並べ替える」という動作をします。
番目 |
xの値 |
keySelectorの返り値 |
1 |
5 |
5 |
2 |
-3 |
3 |
3 |
-8 |
8 |
4 |
0 |
0 |
OrderByはこの結果を見て「返り値が5,3,8,0だから、4番目、2番目、1番目、3番目の順番にすればいいんだな」と判断して、foreachのaには0,-3,5,-8の値を渡す4回ループになります。