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

时间:2015-09-17 09:36:23

标签: c# string linq

给出以下字符串作为示例:

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

我是否有一种“整洁”的方式可以实现这一点,而无需回复到与Char.IsWhitespace()相比较的简单for循环,或者使用子串并使用Get Index of First non-Whitespace Character in C# String中的解决方案

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

3 个答案:

答案 0 :(得分:2)

如果您要开始的索引是8,则可以使用:

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

基本上,你跳过前8个字符,首先是它不是空格并得到它的索引。思考它并不是最有效的方法,但它确实可读。

如果未修复起始索引,则必须先找到该索引并将其注入表达式。

答案 1 :(得分:0)

  

有没有"整洁"我可以实现这个目标

这是:

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;
    }
}

如果您说实施不是&#34;整洁&#34;,则不需要 - 请查看http://referencesource.microsoft.com/

答案 2 :(得分:0)

这仅使用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