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方法根本生成 a List;元素在IEnumerable<T>迭代时即时返回。

我会除了被捕获的异常。我的猜测是你有一个捕获(可能不是你添加的),它正在沿途的某个地方捡起它。

于 2013-01-19T07:04:16.560 回答
1

那是因为你的方法全错了;您可以将 Select 的结果转换为列表 - 只是不像那样 - 仅仅是因为它是IEnumerable而不是List。如果你想要一个列表然后做

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

如果您绝对、具体地 100% 肯定知道您只有一个元素 [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,重要的是要了解正在发生的事情并意识到您正在创建的是某种结果集 - 这与原始 List 不同,这是 IMO LINQ 非常强大的地方 - 你只需要去理解它。


1 - 在这种情况下,您为什么要使用列表....

于 2013-01-19T08:49:15.800 回答