如果我明白你在问什么,它是获取字符串中两个字符的索引之间的最小索引,但问题是如果只有一个存在,则返回另一个的索引,因为它是 @ 987654322@.
解决这个问题的一种方法是在第一个字符串中测试-1,然后决定如何处理第二个:
public static int IndexOf (this string s, char a, char b) => s.IndexOf(a) == -1
// If it's not in 'a', return its index in 'b'
? s.IndexOf(b)
: s.IndexOf(b) == -1
// Else if it's not in 'b', return its index in 'a'
? s.IndexOf(a)
// Otherwise, return the smallest index between 'a' and 'b'
: Math.Min(s.IndexOf(a), s.IndexOf(b));
但是,这个扩展方法有问题!!
因为存在从char 到int 的隐式转换,所以该方法将被IndexOf 方法的native overload 隐藏,该方法采用char 和int,返回“指定字符第一次出现的从零开始的索引,从指定位置开始。”
我相信这是因为在评估任何扩展方法之前评估和选择了本机方法(如果存在隐式匹配),但我可能错了。
为了解决这个问题,我们可以简单地给方法一个不同的名字:
public static int IndexOfFirst (this string s, char a, char b) => s.IndexOf(a) == -1
? s.IndexOf(b)
: s.IndexOf(b) == -1
? s.IndexOf(a)
: Math.Min(s.IndexOf(a), s.IndexOf(b));
另外,我们可以使用params 参数让这个方法处理0 到许多字符,从中找到第一个索引:
public static int IndexOfFirst(this string s, params char[] args) =>
(args?.Any(arg => s.IndexOf(arg) > -1)).GetValueOrDefault()
? args.Select(arg => s.IndexOf(arg))
.Where(index => index > -1)
.Min()
: -1;