Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何实现用作字典键的Struct_C#_Dictionary_Unity3d_Struct - Fatal编程技术网

C# 如何实现用作字典键的Struct

C# 如何实现用作字典键的Struct,c#,dictionary,unity3d,struct,C#,Dictionary,Unity3d,Struct,我正在使用自定义结构作为字典中的键: public struct TV { public int B; public int BC; public int P; public int PO; public int PC; public int W; public int WO; public int WC; public int R;

我正在使用自定义结构作为字典中的键:


    public struct TV
    {
        public int B;
        public int BC;
        public int P;
        public int PO;
        public int PC;
        public int W;
        public int WO;
        public int WC;
        public int R;
        public int RO;
        public int RC;
        public int G;
        public int GO;
        public int GC;
        public int GW;
        public int GWO;
        public int GWC;

        public TV(int b, int bC, int p, int po, int pC, int w, int wo, int wC, int r, int ro, int rC, int g, int go, int gC, int gw, int gwo, int gwC)
        {
            B = b;
            BC = bC;
            P = p;
            PO = po;
            PC = pC;
            W = w;
            WO = wo;
            WC = wC;
            R = r;
            RO = ro;
            RC = rC;
            G = g;
            GO = go;
            GC = gC;
            GW = gw;
            GWO = gwo;
            GWC = gwC;
    }

    }

然而,当我使用.containskey和getkey时,我得到了大量的垃圾收集分配,每帧数以百万计

我已经研究过这个问题,我知道这与结构的不当装箱有关,因为没有实现equals()和getHashCode等方法的IEquatable和重写

我看过一些如何实现这些的例子,但我只找到了2或3个变量的小结构的例子,因为我的结构有17个值,我不知道该如何实现,也因为我不了解哈希代码是如何工作的,如果有人能给我正确的方向指导,我将不胜感激,我应该向该结构添加什么以使其可用作字典键?

此处的键是:

  • 实现
    IEquatable
    (它将通过“受约束”调用调用,而不是通过装箱调用)
  • 在要比较的任何字段上使用合适的哈希函数实现
    GetHashCode()
  • 使用与
    GetHashCode()对齐的相等检查实现
    Equals(TV)
  • Equals(对象)
    实现为
    =>obj是电视类型的&&Equals(类型化的)
  • 这应该避免所有的拳击和反射


    这里有一种方法:

    public struct TV:IEquatable
    {
    公共重写字符串ToString()=>nameof(电视);
    公共int B;
    公共信息中心;
    公共INTP;
    公共国际PO;
    公共int PC;
    公共int W;
    国际公共卫生组织;
    公共厕所;
    公共INTR;
    公共国际组织;
    公共区域中心;
    公共INTG;
    公共int GO;
    公共int GC;
    公共int GW;
    公共国际GWO;
    公共int GWC;
    公共电视(国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台
    {
    B=B;
    BC=BC;
    P=P;
    PO=PO;
    PC=PC;
    W=W;
    WO=WO;
    WC=WC;
    R=R;
    RO=RO;
    RC=RC;
    G=G;
    GO=GO;
    GC=GC;
    GW=GW;
    GWO=GWO;
    GWC=GWC;
    }
    公共覆盖bool Equals(object obj)=>obj是TV-other&&Equals(other);
    公共布尔等于(电视其他)
    {
    返回B==other.B&&
    BC==other.BC&&
    P==other.P&&
    PO==other.PO&&
    PC==other.PC&&
    W==其他。W&&
    WO==其他。WO&&
    WC==other.WC&&
    R==其他。R&&
    RO==其他。RO&&
    RC==other.RC&&
    G==其他.G&&
    GO==其他&&
    GC==other.GC&&
    GW==其他0.GW&&
    GWO==other.GWO&&
    GWC==other.GWC;
    }
    公共覆盖int GetHashCode()
    {
    var hash=新的HashCode();
    添加(B);
    hash.Add(BC);
    hash.Add(P);
    hash.Add(PO);
    hash.Add(PC);
    hash.Add(W);
    hash.Add(WO);
    hash.Add(WC);
    hash.Add(R);
    hash.Add(RO);
    hash.Add(RC);
    添加(G);
    hash.Add(GO);
    hash.Add(GC);
    hash.Add(GW);
    hash.Add(GWO);
    hash.Add(GWC);
    返回hash.ToHashCode();
    }
    }
    
    这里的关键是:

  • 实现
    IEquatable
    (它将通过“受约束”调用调用,而不是通过装箱调用)
  • 在要比较的任何字段上使用合适的哈希函数实现
    GetHashCode()
  • 使用与
    GetHashCode()对齐的相等检查实现
    Equals(TV)
  • Equals(对象)
    实现为
    =>obj是电视类型的&&Equals(类型化的)
  • 这应该避免所有的拳击和反射


    这里有一种方法:

    public struct TV:IEquatable
    {
    公共重写字符串ToString()=>nameof(电视);
    公共int B;
    公共信息中心;
    公共INTP;
    公共国际PO;
    公共int PC;
    公共int W;
    国际公共卫生组织;
    公共厕所;
    公共INTR;
    公共国际组织;
    公共区域中心;
    公共INTG;
    公共int GO;
    公共int GC;
    公共int GW;
    公共国际GWO;
    公共int GWC;
    公共电视(国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台、国际广播电视台
    {
    B=B;
    BC=BC;
    P=P;
    PO=PO;
    PC=PC;
    W=W;
    WO=WO;
    WC=WC;
    R=R;
    RO=RO;
    RC=RC;
    G=G;
    GO=GO;
    GC=GC;
    GW=GW;
    GWO=GWO;
    GWC=GWC;
    }
    公共覆盖bool Equals(object obj)=>obj是TV-other&&Equals(other);
    公共布尔等于(电视其他)
    {
    返回B==other.B&&
    BC==other.BC&&
    P==other.P&&
    PO==other.PO&&
    PC==other.PC&&
    W==其他。W&&
    WO==其他。WO&&
    WC==other.WC&&
    R==其他。R&&
    RO==其他。RO&&
    RC==other.RC&&
    G==其他.G&&
    GO==其他&&
    GC==other.GC&&
    GW==其他0.GW&&
    GWO==other.GWO&&
    GWC==other.GWC;
    }
    公共覆盖int GetHashCode()
    {
    var hash=新的HashCode();
    添加(B);
    hash.Add(BC);
    hash.Add(P);
    hash.Add(PO);
    hash.Add(PC);
    hash.Add(W);
    hash.Add(WO);
    hash.Add(WC);
    hash.Add(R);
    hash.Add(RO);
    hash.Add(RC);
    添加(G);
    hash.Add(GO);
    hash.Add(GC);
    hash.Add(GW);
    hash.Add(GWO);
    hash.Add(GWC);