1

IEnumerable<string>以下が へのキャストに成功しないのはなぜList<string>ですか?

var l = new List<Tuple<string, int>>();
l.Add(new Tuple<string, int>("a string", 1));
List<string> s = (List<string>)l.Select(x => x.Item1); // System.InvalidCastException
MessageBox.Show(s[0]);

また、Visual Studio で例外が適切にキャッチされないのはなぜですか? デバッグ ウィンドウに表示されますが、プログラムの実行は停止しません。

4

2 に答える 2

3

Selectを返しますIEnumerable<T>。結果を として取得する場合はList<T>、次を使用します。

List<string> s = l.Select(x => x.Item1).ToList()

内部的には、Selectメソッドはまったく生成していませんList。が繰り返されると、要素はオンザフライで返されIEnumerable<T>ます。

例外がキャッチされることを除いて。私の推測では、途中のどこかでそれを拾っているキャッチ (おそらく追加したものではない) があると思います。

于 2013-01-19T07:04:16.560 に答える
1

それはあなたのアプローチがすべて間違っているからです。Selectの結果をリストに変換することができます-それはリストではなくIEnumerableであるという理由だけで-そのようにはなりません。リストが必要な場合は、

var string_list = l.Select(x => x.Item1).ToList();

絶対に、具体的には、100%の場合、要素が1つしかないことを確実に知っている[1]場合は、次のようにします。

var l = new List<Tuple<string, int>>();
l.Add(new Tuple<string, int>("a string", 1));
MessageBox.Show( l.Select(x => x.Item1).First() );

リストに複数の要素が含まれている可能性がある場合は、

MessageBox.Show( String.Join(", ", l.Select(x => x.Item1)) );

LINQを効果的に操作したい場合は、何が起こっているのかを理解し、作成しているものが何らかの結果セットであることを理解することが重要です。これは、プリミティブリストとは異なり、IMOLINQが非常に強力な場所です。必要なのはそれを理解する。


1-その場合、なぜリストを操作しているのですか...。

于 2013-01-19T08:49:15.800 に答える