4

質問: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>もコンパイルされません。

Ucheckと入力して、自分の実装を確認することはできますが、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 に答える