我需要能够说出类似的东西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)
你没有错过任何东西。没有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)
MSDN 将向您展示给定类型的所有方法和扩展:MSDN String Class
目前没有专门用于String
准确描述您所提供内容的扩展方法。正如其他人所说,自己动手并不是一个糟糕的选择,因为其他选项(除了并不那么优雅。regex
)
编辑RegEx
我错误地认为使用查找索引 的效率......