为什么从IEnumerableList< string>失败

本文关键字:string 失败 List IEnumerable 为什么 | 更新日期: 2023-09-27 17:54:36

为什么下面的代码不能成功地将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中没有正确捕获异常?它出现在调试窗口中,但不停止程序的执行。

为什么从IEnumerable<string>List< string>失败

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

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

内部Select方法根本不生成List;当IEnumerable<T>被迭代时,这些元素被动态返回。

我将except要捕获的Exception。我的猜测是,您有一个捕获(可能不是您添加的),它在沿途的某个地方捡起它。

这是因为你的方法是错误的;您可以将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,重要的是要理解发生了什么,并意识到你正在创建的是某种结果集——它与原始列表不同,这正是IMO LINQ令人难以置信的强大之处——你只需要理解它。


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