c# - C# 是否可以将 LINQ"取"扩展方法的结果转换为原始类型?

如果将 LINQ Take 扩展方法应用于 SortedList<int, int>,如何将结果转换为新的SortedList<int, int>

从运行时错误中,获取方法的结果是一个 EnumerablePartition,不能转换为 SortedList<int, int>

控制台App中的主要方法编译没问题,但在转换list的结果时会在运行时抛出错误.Take(2)到SortedList


 static void Main(string[] args)


 {


 Console.WriteLine("List");



 var list = new SortedList<int, int>();



 list.Add(2, 10);


 list.Add(8, 9);


 list.Add(3, 15);



 foreach (KeyValuePair<int, int> item in list){


 Console.WriteLine(item.Value);


 };



 Console.WriteLine("Short List");



 var shortlist = (SortedList<int, int>)list.Take(2);



 foreach (KeyValuePair<int, int> item in shortlist)


 {


 Console.WriteLine(item.Value);


 };



 Console.Read();



 }



我期望 Take 方法的结果是新的SortedList<int, int>,或者至少可以转换为一个 SortedList<int, int>,因为这是原始类型。

以下是我正在获取的运行时错误:

Unable to cast object of type 'EnumerablePartition`1[System.Collections.Generic.KeyValuePair`2[System.Int32,System.Int32]]' to type 'System.Collections.Generic.SortedList`2[System.Int32,System.Int32]'

编辑:

我对LINQ和泛型比较新,但是由于提供了出色的答案,我创建了一个新的扩展方法以提高可读性:


 static class Extensions {



 public static SortedList<TKey, TValue> ToSortedList<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> collection)


 {


 var dictionary = collection.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);


 return new SortedList<TKey, TValue>(dictionary);


 }


 }



现在,创建我的候选名单:


var shortlist = list.Take(2).ToSortedList();



我以为上面的东西可能已经可用了!

时间:

假设这是原始类型

是的,但 Take()IEnumerable IEnumerable<KeyValuePair<TKey, TValue>>

所以, 返回的类型与你调用的源不一定有任何关系- 它只是返回 IEnumerable

使用该分区及其适当的构造函数实例化一个新的List:


var shortlist = new SortedList<int, int>(list.Take(2).ToDictionary(kvp => kvp.Key, kvp => kvp.Value));



我希望take方法的结果是一个新的SortedList,或者至少可以在给定这是原始类型的情况下转换为SortedList。

嗯,这种方法并不适合。 如果你从一袋糖果中取出(2),你就会有两个糖果。 你不会因为原来的糖果放在一个袋子里而神奇地拥有一个装有两个糖果的新包。

从技术上讲,Take 方法接受任何类型的IEnumerable<>,并返回相同类型的IEnumerable<> 。 原始容器类型的信息在进程中丢失。

显然,如我们的糖果示例,如果你想你的大袋每一个小袋,从你的大包,没有一个可以阻止你重新包装它们。 如果你需要排序的List,请从结果中创建一个新的排序的List 。 那是手动的。

...