11

C#では、保持要素順序Select()の要素を射影するために使用しますか?IOrderedEnumerable

  • もしそうなら、どうして ではIEnumerableなく を返すのIOrderedEnumerableですか?
  • そうでない場合、どうすればこれを達成できますか (を使用する以外にforeach)?

この質問は、この質問の複製ではないことに注意してSelect()くださいDistinct()

編集

はい、LINQ to Objects です。ところで、実際に SQL DB をクエリしている場合、答えは異なるでしょうか?

4

1 に答える 1

12

Select要素の順序を変更しません。これはストリーミング オペレーター (MSDN)です。つまり、ソース要素をソースの順序で処理し、射影された要素を 1 つずつ生成します。

したがって、順序付けられたソースの射影を行っている場合、射影された結果はソース要素の順序を保持します。


もう 1 つ - なぜ result が実装されないのか不思議に思うかもしれませんIOrderedEnumerable<T>:

int[] items = { 2, 3, 1, 8, 5 };
IEnumerable<int> query = items.OrderBy(i => i).Select(i => i);
bool isOrdered = query is IOrderedEnumerable<int>; // false

これは、オペレーターが、ソース コレクション (この場合) から項目を 1 つずつ読み取り、項目を射影し、射影をSelect返す新しいイテレーター オブジェクト (この場合) を返すためです。この新しいイテレータ オブジェクトはインターフェイスを実装していません。シンプルなだけです。順序付きコレクションはイテレータのソースになりましたが、イテレータ自体ではありません。WhereSelectArrayIteratorOrderedEnumerableIOrderedEnumerable<T>IEnumerable<T>

于 2013-07-15T09:14:48.613 に答える