获取字符串中下一个非空白字符的索引

本文关键字:字符 索引 空白 字符串 下一个 获取 | 更新日期: 2023-09-27 18:13:11

给定以下字符串为例:

"ABC DEF GHI"
如果我想从索引8 (F后的第一个空格)开始搜索,我如何找到下一个非空白字符的索引?

是否有一个"整洁"的方式,我可以实现这一点,而不返回到一个简单的for循环与Char.IsWhitespace()比较,或者取一子字符串,并使用从c#字符串中获取第一个非空白字符的索引的解决方案

(顺便说一句,当我在上面说"整洁"的时候,我并不是热衷于讨论为什么我可能会或可能不会认为我提到的解决方案是"整洁"的-只是对学习新的东西感兴趣,谢谢!)

获取字符串中下一个非空白字符的索引

如果您想从8开始索引,您可以使用:

string text = "ABC  DEF    GHI";
int index = text.IndexOf(text.Skip(8).First(c => !char.IsWhiteSpace(c)));

基本上,您跳过前8个字符,取第一个不是空白的字符并获得其索引。虽然这不是最有效的方法,但它确实具有可读性。

如果起始索引不固定,则必须先找到该索引并将其注入表达式。

有没有一种"简洁"的方法可以让我实现这个

在这里:

void Foo(string s)
{
    int index = s.IndexOfNonWhitespace(8);
}

不编译?你要的是"整洁"的方式,我就给你展示了。BCL没有提供这样的"标准"方法,但这就是程序员和扩展方法存在的原因。

所以,在一些常见的地方,你会写一次这样的东西,然后随时随地使用它:

public static class MyExtensions
{
    public static int IndexOfNonWhitespace(this string source, int startIndex = 0)
    {
        if (startIndex < 0) throw new ArgumentOutOfRangeException("startIndex");
        if (source != null)
            for (int i = startIndex; i < source.Length; i++)
                if (!char.IsWhiteSpace(source[i])) return i;
        return -1;
    }
}

如果您说的实现不"整洁",那么它不需要"整洁"—看看http://referencesource.microsoft.com/

这只使用LINQ:

string str = "ABC  DEF    GHI";
int result = str.Select((c, index) => { if (index > 8 && !Char.IsWhiteSpace(c)) return index; return -1; })
                .FirstOrDefault(i => i != -1);
Console.WriteLine(result == default(int) ?  "Index not found" : result.ToString());   // 12