代码之家  ›  专栏  ›  技术社区  ›  nup

IEqualityComparer和string

  •  0
  • nup  · 技术社区  · 7 年前

    为什么是 IEqualityComparer 不使用字符串?

    type
        TRec = record
            s: string;
        end;
    
    var
        rec1, rec2: TRec;
        comparer: IEqualityComparer<TRec>;
        res: boolean;
    begin
        rec1.s := 'a';
        rec2.s := 'a';
    
        comparer := TEqualityComparer<TRec>.default;
        res := comparer.equals(rec1, rec2);
        showMessage(boolToStr(res));
    

    如果 TRec 条目包含一个数值或一个特定长度的字符串,然后 工作正常。如何使这个代码工作?

    1 回复  |  直到 7 年前
        1
  •  3
  •   MBo    7 年前

    编辑:

    常数 字符串,因为它们共享相同的内存和相同的地址(所以我以前关于更好的RTTI的假设是错误的)。

    所以可靠的方法是

    type
        TRecS = record
            s: string;
        end;
     var
        rec1, rec2: TRecS;
        comparerS: IEqualityComparer<TRecS>;
        cmp: IEqualityComparer<TRecS>;
        res: boolean;
    begin
        rec1.s := 'const';
        rec2.s := 'const';
        comparerS := TEqualityComparer<TRecS>.default;
        res := comparerS.equals(rec1, rec2);
        Memo1.Lines.Add(boolToStr(res));
    
        rec1.s := IntToStr(88);
        rec2.s := IntToStr(88);
        res := comparerS.equals(rec1, rec2);
        Memo1.Lines.Add(boolToStr(res));
    
        cmp := TEqualityComparer<TRecS>.Construct(
                          function(const Left, Right: TRecS): Boolean
                          begin
                              Result := Left.S = Right.S
                          end,
                          nil);
       res := cmp.equals(rec1, rec2);
       Memo1.Lines.Add(boolToStr(res));
    
        -1  //denotes true
        0  
        -1