1

私が取り組んでいるプロジェクトでは、複雑なDictionaryオブジェクトをよく使用します。多くの場合、次のような宣言がたくさんあります。

var d1 = new Dictionary<string, Dictionary<int, List<string>>>();
var d2 = new Dictionary<Tuple<string, string>, List<object>>();

タイプキャストとパラメータの受け渡しの間など、これは煩わしいものになります。私がやりたいのは、架空のキーワード「typedel」を使用した次のようなものです。

typedel ListDict = Dictionary<string, Dictionary<int, List<string>>>();
typedel PolyDict = Dictionary<Tuple<string, string>, List<object>>();

var d1 = new ListDict();
var d2 = new PolyDict();

毎回長いDictionary宣言を入力する必要がないように、つまり、型名の省略形を定義するようなものが必要です。これを最も簡単な方法で(コードの数行を使用して)行うにはどうすればよいですか?

4

3 に答える 3

5
class MyData : Dictionary<string, Dictionary<int, List<string>>>
{

}

これを行うこともできますが、を使用するすべてのファイルでこれを行う必要がありMyData、それはおそらく最適ではありません。

using MyData = Dictionary<string, Dictionary<int, List<string>>>;
于 2012-07-27T00:37:59.557 に答える
4

頻繁に使用する「typedef」の場合は、@ Ed Sの回答のように、適切な基本クラスから派生するクラスを作成するだけです。

class MyData : Dictionary<string, Dictionary<int, List<string>>>
{   
}

ただし、これはほとんどの人がtypedefと見なすものと同じではありません。新しい型を導入します。これは、リフレクション、、演算子などに影響しますtypeofis区別は重要な場合と重要でない場合がありますが、そこにあります。 。

ただし、単一のソースファイル内で、using句の2番目の形式を使用して実際のtypedefを実行できます。

using ListDict = Dictionary<string, Dictionary<int, List<string>>>();
using PolyDict = Dictionary<Tuple<string, string>, List<object>>();

いずれの場合も、「typedef」を使用すると入力を確実に節約できますが、コードに明示的に記述されている型を確認することの利点を軽視しないでください。これは、このブログ投稿List<Foo>などの記事がカスタムよりも使用を推奨しているのと同じ理由FooCollection : List<Foo>です。明示的な汎用バージョンを使用すると、どのタイプのコレクションであり、どのメソッドを公開するかがわかります。

于 2012-07-27T00:41:43.397 に答える
1

そして、笑いのためだけに...

    static Func<T> Magic<T>(Func<T> f) { return f; }
    static Func<T> Creator<T>() where T : new() { return () => new T(); }
    ...
    var ListDict = Magic(() => new Dictionary<string, Dictionary<int, List<string>>>());
    var PolyDict = Creator<Dictionary<Tuple<string, string>, List<object>>>();
    var d1 = ListDict();
    var d2 = PolyDict();
于 2012-07-27T01:00:13.357 に答える