方法参数C#中的有界泛型类型

时间:2013-03-03 22:08:45

标签: c# generics bounded-types

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

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

尝试:以下代码需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,但我不愿意。

1 个答案:

答案 0 :(得分:4)

在写完我的问题后不久,我在MSDN上找了一篇关于generics的文章,我已经浏览了一段时间,但是在页面的中间我发现了我正在寻找的答案。以下是解决方案的代码:

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上找到任何具体内容,这可能对其他人最终寻找同样的事情有所帮助。