为什么从IEnumerable <string>转换为List <string>失败?</string> </string>

时间:2013-01-19 07:02:42

标签: c# linq casting classcastexception

为什么以下内容无法将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中没有正确捕获异常?它出现在调试窗口中,但不会停止执行程序。

2 个答案:

答案 0 :(得分:3)

Select会返回IEnumerable<T>。如果您希望结果为List<T>,请使用:

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

Select方法内部根本不会生成List; IEnumerable<T>时会动态返回元素。

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

答案 1 :(得分: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 - 在这种情况下,你为什么要使用列表....

相关问题