2

別のように使用Dictionaryしたいと思います。パイソンに似た何か。これを試しましたが、エラーが発生します。TKeyDictionary

Dictionary<Dictionary<string, string>, int> dict = new Dictionary<Dictionary<string,    string>, int>();
Dictionary<string, string> dict2 = new Dictionary<string, string>();
dict2["abc"] = "def";
dict[dict["abc"] = 20;
4

3 に答える 3

10

どのようなエラーが発生していますか? 4行目にブラケットがないことについて不平を言っていますか?

4行目は次のようになります。

dict[dict["abc"]] = 20;

ただし、「abc」は dict のキーではないため、おそらくこれを意味します。

dict[dict2["abc"]] = 20;

しかし、 dict のキーが でdict2["abc"]あるstringはずの場合、Dictionary<string, string>です。

しかし、この道を進む前に、この時点で当初の目標を再検討しましょう。そもそも可変型を辞書のキーとして使用するべきではありません。

これはあなたが探しているコードかもしれません:

Dictionary<string, int> dict  = new Dictionary<string, int>();
Dictionary<string, string> dict2 = new Dictionary<string, string>();
dict2["abc"] = "def";
dict[dict2["abc"]] = 20;

しかし、確実に言うのは難しいです。

于 2009-01-11T18:36:52.530 に答える
6

これをそこに投げ込むだけで、あなたが説明するような複雑な辞書を扱う場合、コードの読者にそれを整理させようとするよりも、実際の名前を使用する方がはるかに良いことがよくあります。

個人の好みに応じて、2 つの方法のいずれかを実行できます。using ステートメントを使用して、コンパイラのエイリアスを作成します。これはコンパイラのエイリアスであるため、完全修飾型名を使用する必要があることに注意してください。

using ComplexKey = System.Collections.Generic.Dictionary<String, String>;
using ComplexType = System.Collections.Generic.Dictionary<
   System.Collections.Generic.Dictionary<String, String>,
   String
   >;

または、本格的な型の方法を使用して、Dictionary から継承するクラスを実際に作成することもできます。

class ComplexKey : Dictionary<String, String> { ... }
class ComplexType : Dictionary<ComplexKey, String> { ... }

これを行うと、あなたとコードの読者の両方が、何をしているのかを理解するのがはるかに簡単になります。私の一般的な経験則は、ジェネリックのジェネリックを作成している場合は、むしろ私のロジックを表すためにいくつかのファーストクラスの市民を構築することを検討する時です。

于 2009-01-11T18:41:37.437 に答える
4

「dict["abc"] は辞書ではなく「文字列」だからです。

正しい、あなたが尋ねたのは:

Dictionary<Dictionary<string, string>, int> dict = new Dictionary<Dictionary<string,    string>, int>();
Dictionary<string, string> dict2 = new Dictionary<string, string>();
dict2["abc"] = "def";
dict[dict2] = 20;

しかし、私にはわかりません。これがあなたが本当に望んでいるもの/必要としているものです。

于 2009-01-11T18:34:00.633 に答える