如何让if-else返回结果不依赖顺序,而依据目标字符串顺序?
按匹配内容在目标字符串中的出现顺序返回结果
我懂你的痛点——现在的if-else逻辑完全是按你写代码的顺序来判断,不管目标字符串里哪个匹配项先出现。要实现按匹配内容在stringVar中的实际出现顺序返回,我们可以换个思路:先找出所有匹配项在目标字符串里的起始位置,再选位置最靠前的那个返回。
具体实现思路
- 把要匹配的候选字符串(比如示例里的x和y)放到一个集合里——这样以后要加更多匹配项,直接往集合里加就行,不用大改逻辑
- 遍历每个候选,用
string.IndexOf()找到它在stringVar中的起始索引;如果找不到就标记为一个极大值(相当于排除这个候选) - 筛选出所有能匹配到的候选,再按起始索引排序,取第一个就是最先出现的匹配项
代码示例
string x = "123"; string y = "abc"; string stringVar = "abc123"; // 换成"123abc"就能测试另一种情况 // 把候选项统一放到列表里,方便扩展 var candidates = new List<string> { x, y }; // 找出每个候选的起始位置,找不到的项直接过滤掉 var candidatePositions = candidates .Select(c => new { Value = c, Position = stringVar.IndexOf(c) }) .Where(item => item.Position != -1); // 按位置排序,取第一个就是最先出现的匹配项 var firstMatch = candidatePositions.OrderBy(item => item.Position).FirstOrDefault(); if (firstMatch != null) { return firstMatch.Value; // 会根据实际出现顺序返回x或y } // 没有匹配项的情况,可以按需设置默认返回值 return string.Empty;
为什么这个方案适合你的场景?
- 不依赖
StartsWith():不管匹配内容在目标字符串的中间还是末尾,IndexOf()都能精准定位它的起始位置 - 不需要拆分字符串:完全基于索引位置判断,不用纠结有没有分隔符的问题
- 扩展性拉满:以后要加更多匹配候选,只要往
candidates列表里加元素,核心逻辑不用动
测试验证
- 当
stringVar = "123abc"时,x的起始位置是0,y是3,所以返回x - 当
stringVar = "abc123"时,y的起始位置是0,x是3,所以返回y
内容的提问来源于stack exchange,提问作者Waqas
相关产品推荐
相关产品推荐

