C#字符串多值匹配实现咨询(Revit管道工具开发)
C#字符串多值匹配实现方案(附Revit代码修改)
首先明确:C#不支持string joint = "Press Joint" || "ProPress";这种直接赋值多值的写法,但可以通过以下几种方式实现字符串多值匹配需求,包括你问的switch语句:
方法1:用集合判断(最简洁高效)
创建一个包含所有目标匹配值的集合,通过Contains方法判断目标字符串是否在集合内。推荐用HashSet<string>,它的查找效率比List<string>更高。
结合你的Revit代码修改:
在Execute方法里,把原来的单个pressJoint字符串定义替换成集合:
// 替换原来的string pressJoint = "Press Joint"; var pressJointTypes = new HashSet<string> { "Press Joint", "ProPress", "PressFit" };
然后在判断条件里,把fabricationPart.ProductInstallType == pressJoint替换成:
pressJointTypes.Contains(fabricationPart.ProductInstallType)
修改后的完整判断块示例:
#region Press To Existing Soldered if ( (pressJointTypes.Contains(fabricationPart.ProductInstallType) && (decimal)lLength.AsDouble() < 0.2239583333m && fabricationPart.ProductSizeDescription == "1-1/4") || (pressJointTypes.Contains(fabricationPart.ProductInstallType) && (decimal)lLength.AsDouble() < 0.2812500000m && fabricationPart.ProductSizeDescription == "1-1/2") || (pressJointTypes.Contains(fabricationPart.ProductInstallType) && (decimal)lLength.AsDouble() < 0.3229166667m && fabricationPart.ProductSizeDescription == "2") ) #endregion
注意:原来的条件未给每组判断加括号,由于
&&优先级高于||,可能导致逻辑错误,上面的修改已给每组判断加上括号,确保逻辑正确。
方法2:用switch语句实现
可以利用C#的switch多case共用逻辑,或者模式匹配语法:
写法一:多case共用逻辑
bool isPressJoint = false; switch(fabricationPart.ProductInstallType) { case "Press Joint": case "ProPress": case "PressFit": isPressJoint = true; break; default: isPressJoint = false; break; } // 之后在判断条件里用isPressJoint代替原来的fabricationPart.ProductInstallType == pressJoint
写法二:模式匹配(C# 8.0+支持)
bool isPressJoint = fabricationPart.ProductInstallType switch { "Press Joint" or "ProPress" or "PressFit" => true, _ => false };
把isPressJoint变量代入你的判断条件即可,用法和集合方法一致。
额外优化建议
- 可把这些匹配值定义成常量或枚举,避免硬编码字符串,方便后续维护。
- 你的代码里
lLength.AsDouble().ToString();和fpdsd.AsDouble().ToString();未赋值给变量,属于无效代码,可直接删除。
内容的提问来源于stack exchange,提问作者nhilson
相关产品推荐
相关产品推荐

