首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEqualityComparer和string

IEqualityComparer和string
EN

Stack Overflow用户
提问于 2018-10-12 06:40:11
回答 1查看 431关注 0票数 1

为什么IEqualityComparer不处理字符串?

代码语言:javascript
复制
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条目包含数字值或一定长度的字符串,则IEqualityComparer正确工作。如何使这段代码工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-12 06:51:52

编辑:

正如Rudy在评论中所注意到的,在新的Delphi版本中,对于相同的常量字符串来说,结果是正确的,因为它们共享相同的内存并且具有相同的地址(所以我以前关于更好的RTTI的假设是错误的)。

对于复杂类型,相等默认比较器仍然选择比较两个记录的原始字节的低级比较器--在我的示例的第二种情况下,类似字符串体的不同附件。

因此,可靠的方法是构建自己的比较器来处理复杂类型--参见下面的第三个示例。

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52773699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档