是否有一个带谓词的String.IndexOf?

Tom*_*Tom 10 .net c# linq

我需要能够说出类似的东西myString.IndexOf(c => !Char.IsDigit(c)),但我在.NET框架中找不到任何这样的方法.我错过了什么?

以下作品,但滚动我自己似乎有点单调乏味:

using System;

class Program
{
    static void Main()
    {
        string text = "555ttt555";
        int nonDigitIndex = text.IndexOf(c => !Char.IsDigit(c));
        Console.WriteLine(nonDigitIndex);
    }
}

static class StringExtensions
{
    public static int IndexOf(this string self, Predicate<char> predicate)
    {
        for (int index = 0; index < self.Length; ++index) {
            if (predicate(self[index])) {
                return index;
            }
        }
        return -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 5

你没有错过任何东西。没有IndexOf您在框架中搜索的方式。您可以在不滚动自己的情况下做的最接近的事情是

text
  .Select((c, index) => new { Char = c, Index = index })
  .Where(pair => !Char.IsDigit(pair.Char))
  .Select(pair => pair.Index)
  .FirstOrDefault(-1);
Run Code Online (Sandbox Code Playgroud)

然而,这并不容易遵循并导致无意义的分配。IndexOf在这种情况下,我更愿意自己动手。

编辑哎呀。忘记了这FirstOrDefault是我在应用程序中手动滚动的功能,并且不是具有此重载的标准 LINQ 库的一部分。

public static T FirstOrDefault<T>(this IEnumerable<T> enumerable, T defaultValue) {
  using (var enumerator = enmumerable.GetEnumerator()) {
    if (enumerator.MoveNext()) {
      return enumerator.Current;
    }
    return defaultValue;
}
Run Code Online (Sandbox Code Playgroud)

这是一个无需任何自定义扩展即可工作的版本。请注意,这仅作为示例,请不要将其放入您的应用程序中;)

text
  .Select((c, index) => new { Char = c, Index = index })
  .Where(pair => !Char.IsDigit(pair.Char))
  .Select(pair => pair.Index)
  .Concat(Enumerable.Repeat(-1, 1))
  .First();
Run Code Online (Sandbox Code Playgroud)

  • +1 表示:*​​在这种情况下,我更喜欢滚动我自己的 IndexOf。* 恕我直言,OP 的使用非常好 (2认同)

IAb*_*act 1

MSDN 将向您展示给定类型的所有方法和扩展:MSDN String Class

目前没有专门用于String准确描述您所提供内容的扩展方法。正如其他人所说,自己动手并不是一个糟糕的选择,因为其他选项(除了regex并不那么优雅。

编辑RegEx我错误地认为使用查找索引 的效率......