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给出了可用集合运算符的完整列表. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |