4

问题:C# 是否支持方法参数中的有界泛型类型?如果是这样,语法是什么?

上下文:我正在编写一个实用方法,Dictionary对字典中的值进行排序。因此,Dictionary必须实现IComparable接口中的值。

Attempt(s):下面的代码采用 a Dictionary,获取 的列表KeyValuePair,对 进行排序Value,然后返回字典中的顶部键,如它们的值所报告的那样。

private string[] getTopWords<T , U>(Dictionary<T, U> similarWordsAndWeights)
{
    var myList = similarWordsAndWeights.ToList();

    myList.Sort((firstPair, nextPair) =>
    {
        return -firstPair.Value.CompareTo(nextPair.Value);
    }
    );
    var dictionary = myList.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value);
    return createStringArrayFromGenericList(dictionary.Keys.ToList().GetRange(0, 10));
}

但是,此代码不会编译,因为U不是“保证”实现IComparable。语法private string[] getTopWords<T, U : IComparable>也不会编译。

我可以输入检查以查看我的U工具,IComparable但我宁愿不这样做。

4

1 回答 1

4

因此,在写完我的问题后不久,我在 MSDN 上查找了一篇关于泛型的文章,我已经通过了该文章,但是在页面的中途我找到了我正在寻找的答案。这是解决方案的代码:

private string[] getTopWords<T , U>(Dictionary<T, U> similarWordsAndWeights) where U : IComparable
{
    var myList = similarWordsAndWeights.ToList();

    myList.Sort((firstPair, nextPair) =>
    {
        return -firstPair.Value.CompareTo(nextPair.Value);
    }
    );
    var dictionary = myList.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value);
    return createStringArrayFromGenericList(dictionary.Keys.ToList().GetRange(0, NUMBER_OF_WORDS_TO_RETURN));
}

您似乎在参数之后进行了边界声明。我之前一直在寻找一些东西(具有 Java 背景),当然找不到任何东西。一个人在谷歌上只需要多花几分钟就能完成的事情真是太神奇了……

我认为分享我的解决方案是明智的,因为我无法在 SO 上找到任何具体的内容,它可能对最终搜索相同内容的其他人有所帮助。

于 2013-03-03T22:08:45.043 回答