【问题标题】:Extension method for dictionary with value implementing interface具有值实现接口的字典的扩展方法
【发布时间】:2018-02-22 16:23:24
【问题描述】:

我正在尝试为所有字典实现扩展方法,这些字典的值是实现某个接口的类型。 在这种情况下,我想要一个返回的 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();
}

编辑: 它已经解决了,但为了完整起见,这是我遇到的问题: 尝试使用该方法时出现错误,好像该方法不存在一样。如果我使用实际的可比较类型而不是 IComparable,比如 int 或实现 IComparable 的类,那么它会起作用。

【问题讨论】:

  • 为什么它不起作用?
  • 为什么不在具有IComparable约束的值类型上使其通用?
  • 因为在尝试使用该方法时,如果该方法不存在,我会收到错误消息。如果我使用实际的可比较类型而不是 IComparable,比如 int 或实现 IComparable 的类,那么它将起作用。
  • juharr 这听起来像我需要的,你能发布一些示例代码吗?这将是巨大的帮助!
  • @ManuelVenè 您应该在问题中包含有关错误的信息。

标签: c# dictionary interface extension-methods


【解决方案1】:

基本上你需要在值类型上使方法泛型,然后将该类型约束为IComparable&lt;T&gt;

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();
}

【讨论】:

  • 应该是IComparable&lt;T&gt;
  • @SLaks 是的,这样更好。
  • 绝对棒极了!! whit IComparable 它工作得很好。键上额外的泛化位使它变得更大。非常感谢!
【解决方案2】:

您需要使您的方法通用,以便它扩展您的实际类型,而不仅仅是IComparable

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

【讨论】:

    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多