2013-03-03 94 views
4

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

语境:我写排序在字典中的值的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>也不会编译。

我可以打字检查看看我的U执行IComparable然而我宁愿不。

回答

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

+0

只是在C#中提到这些被称为泛型类型约束,您应该能够通过搜索这些术语在StackOverflow和其他网站上找到关于它们的大量其他信息。 – jam40jeff 2013-03-06 05:08:43

+0

谢谢@ jam40jeff我会记住的,所以下次我可以找到相关信息。 – nattyddubbs 2013-03-06 13:19:08