c#方法参数中的有界泛型

本文关键字:泛型 方法 参数 | 更新日期: 2023-09-27 18:02:14

问题: c#在方法参数中支持有界泛型吗?如果是,语法是什么?

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

尝试(s):下面的代码获取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>也不能编译。

我可以输入check,看看我的U实现了IComparable,但我宁愿不。

c#方法参数中的有界泛型

所以在写完我的问题后不久,我在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上找到任何具体的东西,它可能对其他人最终搜索相同的东西有所帮助。