为什么从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中没有正确捕获异常?它出现在调试窗口中,但不停止程序的执行。
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 -在这种情况下,为什么要使用列表....