我遇到了以下代码的意外问题.
List<string> items = new List<string>();
items = items.OrderBy(item => item);
Run Code Online (Sandbox Code Playgroud)
此代码生成错误:
无法将类型'System.Linq.IOrderedEnumerable'隐式转换为'System.Collections.Generic.List'.存在显式转换(您是否错过了演员?)
看来我可以改为items类型IEnumerable<string>,错误就消失了.但我需要能够将项目添加到列表中,这IEnumerable不支持.
有人可以帮我理解这个错误,最容易解决的是什么?简单地投射结果是否安全?
pho*_*oog 46
为什么不使用Sort()实例方法对列表进行排序; 然后,如果您愿意,可以在以后添加项目:
List<string> items = GetSomeItems();
items.Sort();
Run Code Online (Sandbox Code Playgroud)
或者,使用有序集合,如二叉搜索树. SortedSet<T>根据您的需要,可能符合要求.
其他人建议的解决方案:
items = items.OrderBy(item => item).ToList();
Run Code Online (Sandbox Code Playgroud)
...使用新订单中的原始项目创建另一个列表.这仅在您需要为其他目的保留原始排序时才有用; 它比内存排序更浪费内存.
至于理解错误,它很简单:List<T>不是子类型IOrderedEnumerable<T>,因此两者之间没有隐式引用转换.编译器建议的显式强制转换将满足编译器,但它将在运行时失败,因为返回的对象OrderBy<T>不会继承List<T>.
编辑
List<T>.Sort(Comparison<T>)假设类型MyType具有Key某种类型T 的属性的示例,其中T : IComparable<T>:
List<MyType> items = GetSomeItems();
items.Sort((a, b) => a.Key.CompareTo(b.Key));
Run Code Online (Sandbox Code Playgroud)
Rya*_*n P 17
你需要将其转换IEnumerable为a List.试试这个:
items = items.OrderBy(item => item).ToList();
Run Code Online (Sandbox Code Playgroud)
您需要使用LINQ的ToList()方法
items = items.OrderBy(item => item).ToList();
Run Code Online (Sandbox Code Playgroud)
您无法直接从IEnumerable <>转换为List <>
| 归档时间: |
|
| 查看次数: |
41655 次 |
| 最近记录: |