2017-01-06 6 views
-1

私は辞書を作成しようとしているときに問題に直面しています。ここで、キーはSystem.Enumです。問題は、このような辞書は、デフォルトのEqualityComparerが最高のものではないため、ガベージを割り当てます。私は自分自身の比較人を書くことを試みたが、成功しなかった。それはどういうわけか可能ですか?ボクシングなしのSystem.Enumの辞書のComparer

public enum MyEnum 
{ 
    One, Two, Three 
} 

public Dictionary<Enum, string> dict = new Dictionary<Enum, string>(); 

public void Test() 
{ 
    this.dict.Add(MyEnum.One, "One"); 
    this.dict.Add(MyEnum.Two, "Two"); 
    this.dict.Add(MyEnum.Three, "Three"); 

    string result; 
    this.dict.TryGetValue(MyEnum.Two, out result); // <-- memory alocation :-(
} 
+0

ディクショナリの宣言に入力ミスがありますか?あなたの列挙型は 'MyEnum'ですが、あなたの辞書は' Dictionary ' – maccettura

+1

です。なぜあなたの辞書タイプは' 'で、' 'ではないのですか? –

+0

私の辞書はmaベースのクラスに格納されているため、Iamは毎回別々の列挙型を持つ派生クラスを作成します – MrIncognito

答えて

2

例のコメントを見て、これがUnityの場合は、this clip from Unite 2016をご覧ください。これは、辞書キーの列挙型ではなく、Scriptable Objectsの使用について語っています。あなたがどうなるのか

たちはScriptableObjectから継承する理由は、あなたがデザイナーに列挙型を公開したい場合は、右のデザイナーに列挙値をドラッグ&ドロップできていることを

public class Program 
{ 
    protected Dictionary<ScriptableObject, string> dict = new Dictionary<ScriptableObject, string>(); 
} 

public class ProgramChild1 : Program 
{ 
    public void Test() 
    { 
     dict.Add(MyEnum1.One.Instance, "One"); 
     dict.Add(MyEnum1.Two.Instance, "Two"); 
     dict.Add(MyEnum1.Three.Instance, "Three"); 
     string result; 
     dict.TryGetValue(MyEnum1.Two.Instance, out result); 
    } 
} 

public class ProgramChild2 : Program 
{ 

    public void Test() 
    { 
     dict.Add(MyEnum2.Four.Instance, "One"); 
     dict.Add(MyEnum2.Five.Instance, "Two"); 
     dict.Add(MyEnum2.Six.Instance, "Three"); 
     string result; 
     dict.TryGetValue(MyEnum2.Five.Instance, out result); 
    } 
} 

//Each class goes in to its own .cs file, Put them in two folders `MyEnum1` and `MyEnum2` 
namespace MyEnum1 
{ 
    public class One : ScriptableObject 
    { 
     private static One _inst; 
     public static One Instance 
     { 
      get 
      { 
       if (!_inst) 
        _inst = Resources.FindObjectOfType<One>(); 
       if (!_inst) 
        _inst = CreateInstance<One>(); 
       return _inst; 
      } 
     } 
    } 
} 

namespace MyEnum1 
{ 
    public class Two : ScriptableObject 
    { 
     private static Two _inst; 
     public static Two Instance 
     { 
      get 
      { 
       if (!_inst) 
        _inst = Resources.FindObjectOfType<Two>(); 
       if (!_inst) 
        _inst = CreateInstance<Two>(); 
       return _inst; 
      } 
     } 
    } 
} 

namespace MyEnum1 
{  
    public class Three : ScriptableObject 
    { 
     private static Three _inst; 
     public static Three Instance 
     { 
      get 
      { 
       if (!_inst) 
        _inst = Resources.FindObjectOfType<Three>(); 
       if (!_inst) 
        _inst = CreateInstance<Three>(); 
       return _inst; 
      } 
     } 
    } 
} 

namespace MyEnum2 
{  
    public class Four : ScriptableObject 
    { 
     private static Four_inst; 
     public static Four Instance 
     { 
      get 
      { 
       if (!_inst) 
        _inst = Resources.FindObjectOfType<Four>(); 
       if (!_inst) 
        _inst = CreateInstance<Four>(); 
       return _inst; 
      } 
     } 
    } 
} 

namespace MyEnum2 
{  
    public class Five : ScriptableObject 
    { 
     private static Five _inst; 
     public static Five Instance 
     { 
      get 
      { 
       if (!_inst) 
        _inst = Resources.FindObjectOfType<Five>(); 
       if (!_inst) 
        _inst = CreateInstance<Five>(); 
       return _inst; 
      } 
     } 
    } 
} 

namespace MyEnum2 
{  
    public class Six : ScriptableObject 
    { 
     private static Six _inst; 
     public static Six Instance 
     { 
      get 
      { 
       if (!_inst) 
        _inst = Resources.FindObjectOfType<Six>(); 
       if (!_inst) 
        _inst = CreateInstance<Six>(); 
       return _inst; 
      } 
     } 
    } 
} 

注意を持っています列挙型で基本クラスだけの場合は、これを実行できませんでした。

public class ProgramChild2 : Program 
{ 
    public ScriptableObject SelectedValue; 
    public void Test() 
    { 
     dict.Add(MyEnum2.Four.Instance, "One"); 
     dict.Add(MyEnum2.Five.Instance, "Two"); 
     dict.Add(MyEnum2.Six.Instance, "Three"); 
     string result; 
     dict.TryGetValue(SelectedValue, out result); 
    } 
}