从某一点来说,我厌倦了编写设置条件(和,或),因为对于更多的条件或更长的变量名称,它开始变得笨拙并且令人讨厌再次写入.所以我开始编写助手,这样我就可以编写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给出了可用集合运算符的完整列表.