0

というエンティティのリストを取得しました。そこから、次のようusagesにタイプ のエンティティの IEnumerable を作成します。AdminUsage

var models = usages.Select(u => new AdminUsage(u));

呼び出す.ToList()models、「インデックスが配列の範囲外でした」というメッセージとともに IndexOutOfRange 例外が発生します。

なぜこれが起こっているのでしょうか?AdminUsage元のリストからList of type を正常に取得するにはどうすればよいusagesですか?

編集:OK、実際には範囲外のインデックスはAdminUsageコンストラクター内にありました:

public AdminUsageModel(Usage usageDetails) { Title = usageDetails.UsageName[0] }

だから私の修正された質問は、なぜ例外が呼び出し.ToList()でのみスローされ、元のものではスローされないの.Select()ですか?

4

1 に答える 1

3

元の .Select() ではなく、呼び出し .ToList() でのみ例外がスローされるのはなぜですか?

aSelect()は何もしないので、それは約束です。そのToList()約束を具体化すると、コードが実際に実行され、例外がスローされます。

MSDN:IEnumerable<T>.Select()も参照してください。

このメソッドは、遅延実行を使用して実装されます。即時の戻り値は、アクションの実行に必要なすべての情報を格納するオブジェクトです。このメソッドによって表されるクエリは、GetEnumerator メソッドを直接呼び出すか、Visual C# の foreach または Visual Basic の For Each を使用して、オブジェクトが列挙されるまで実行されません。

遅延実行と熱心な評価linq/遅延実行がどのように機能するかを理解しようとするも参照してください。

于 2015-02-25T16:04:55.077 に答える