Если я применяю метод расширения LINQ Take
к SortedList<int, int>
, как мне преобразовать результат в новый SortedList<int, int>
?
Из-за полученной ошибки времени выполнения метод Take является EnumerablePartition
, который не может быть приведен к SortedList<int, int>
Основной метод в консольном приложении компилируется нормально, но выдает ошибку во время выполнения при приведении результата 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]'
EDIT:
Я относительно новичок в LINQ и Generics, но благодаря полученным отличным ответам я создал новый метод расширения для удобства чтения:
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();
Я думал, что что-то подобное может быть уже доступно!