Метод расширения для словаря со значением реализующий интерфейс

-5

Я пытаюсь реализовать метод расширения для всех словарей, значение которых имеет тип, реализующий определенный интерфейс. В этом случае я хотел бы иметь метод ToListSortedByValue(), который возвращает

List<KeyValuePair<string, IComparable>> 

для любого словаря типа

Dictionary<string, IComparable>

это было бы здорово, потому что это позволило бы мне использовать словари вместо списков, но иметь возможность сортировать их по мере необходимости (например, при печати в файлах или на консоли).

Это то, что я пробовал, но это не работает, любая идея почему?

public static List<KeyValuePair<string, IComparable>> ToListSortedByValue(this Dictionary<string, IComparable> Dic)
{
return Dic.OrderBy(x => x.Value).ToList();
}

EDIT: он решил уже, но для полноты этой цели я получил: при попытке использовать метод я получил ошибку, как будто такой метод не существовал. Если вместо IComparable я использую фактический сопоставимый тип, скажем, int или класс, реализующий IComparable, чем он будет работать.

спросил(а) 2021-01-19T15:25:07+03:00 9 месяцев назад
1
Решение
79

В основном вам нужно сделать метод общим для типа значения, а затем ограничить его тип IComparable<T>.

public static List<KeyValuePair<string, T>> ToListSortedByValue<T>(
this Dictionary<string, T> Dic) where T : IComparable<T>
{
return Dic.OrderBy(x => x.Value).ToList();
}

У этого есть дополнительный бонус, возвращающий значения, как они прошли в типе. Возможно, вы даже захотите создать общий тип ключа, чтобы он не ограничивался только string

public static List<KeyValuePair<TKey, TValue>> ToListSortedByValue<TKey, TValue>(
this Dictionary<TKey, TValue> Dic) where TValue : IComparable<TValue>
{
return Dic.OrderBy(x => x.Value).ToList();
}

ответил(а) 2021-01-19T15:25:07+03:00 9 месяцев назад
47

Вам нужно сделать свой метод общим, чтобы он расширил ваш фактический тип, а не только IComparable:


public static List<KeyValuePair<string, T>> ToListSortedByValue<T>(this Dictionary<string, T> Dic) where T : IComparable<T>

ответил(а) 2021-01-19T15:25:07+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема