加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何比较枚举类型的集合

发布时间:2020-12-15 04:15:51 所属栏目:大数据 来源:网络整理
导读:从某一点来说,我厌倦了编写设置条件(和,或),因为对于更多的条件或更长的变量名称,它开始变得笨拙并且令人讨厌再次写入.所以我开始编写助手,这样我就可以编写ASet.ContainsOne([ceValue1,ceValue2])而不是(ASet中的ceValue1)或(ASet中的ceValue2). type TCust
从某一点来说,我厌倦了编写设置条件(和,或),因为对于更多的条件或更长的变量名称,它开始变得笨拙并且令人讨厌再次写入.所以我开始编写助手,这样我就可以编写ASet.ContainsOne([ceValue1,ceValue2])而不是(ASet中的ceValue1)或(ASet中的ceValue2).
type
  TCustomEnum = (ceValue1,ceValue2,ceValue3);
  TCustomSet = set of TCustomEnum;
  TCustomSetHelper = record helper for TCustomSet 
    function ContainsOne(ASet: TCustomSet): Boolean;
    function ContainsAll(ASet: TCustomSet): Boolean;
  end;

implementation

function TCustomSetHelper.ContainsOne(ASet: TCustomSet): Boolean;
var
  lValue : TCustomEnum;
begin
  for lValue in ASet do
  begin
    if lValue in Self then
      Exit(True);
  end;
  Result := False;
end;

function TCustomSetHelper.ContainsAll(ASet: TCustomSet): Boolean;
var
  lValue : TCustomEnum;
begin
  Result := True;
  for lValue in ASet do
  begin
    if not (lValue in Self) then
      Exit(False);
  end;
end;

不幸的是,这不是最有效的解决方案,而是违反DRY原则.令我惊讶的是,我没有发现任何人遇到同样的问题,所以我想知道是否有更好的(通用)解决方案?

解决方法

set operators可帮助您实现这些功能

对于ContainsOne,我们使用*运算符,它是集合交集运算符.

function TCustomSetHelper.ContainsOne(ASet: TCustomSet): Boolean;
begin
  Result := ASet * Self <> [];
end;

对于ContainsAll,我们将使用< =这是子集运算符.

function TCustomSetHelper.ContainsAll(ASet: TCustomSet): Boolean;
begin
  Result := ASet <= Self;
end;

鉴于这些表达式有多简单,我怀疑你是否需要帮助器类型.

documentation给出了可用集合运算符的完整列表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读