如何查找不在列表中的字符串中的第一个char的索引

时间:2008-11-19 00:30:21

标签: c# string search

我知道我可以遍历字符串或构建正则表达式或反转集合(毕竟ASCII不是那么大)并搜索第一个实例,但是Yuck。

我正在寻找的是一个很好的衬垫。

更少的功能更好,LINQ已经出局(对我来说,不要问,这是故事)


我要去的解决方案(除非我看到更好的东西)

static int FirstNotMeta(int i, string str)
{
    for(; i < str.Length; i++)
        switch(str[i])
        {
            case '\\':
            case '/':
            case '.':
                continue;
            default:
                return i;
        }
    return -1;
}

好的,我作弊,我事先知道我关心的是什么char。

4 个答案:

答案 0 :(得分:7)

这有效:

public static char FindFirstNotAny(this string value, params char[] charset)
{
    return value.TrimStart(charset)[0];
}

答案 1 :(得分:2)

如果您无法访问LINQ,我认为您可能只需编写一个带循环的静态方法(这可能比LINQ更有效。请记住编译器会在可能的情况下内联小方法。

我能提出的最简单的非LINQ如下。我建议添加大括号,以便范围和块清晰:

public static char? GetFirstChar(string str, char[] list)
{
    foreach (char c in str) if (!list.Contains(c)) return c;
    return null;
}

使用C#3.0和LINQ:

char[] list = { 'A', 'B' };
string str = "AABAGAF";

char first = str.ToArray().Where(c => !list.Contains(c)).FirstOrDefault();

在这种情况下,如果没有非列表字符,则首先等于0x0000(或字符 null)。你可以这样做:

char? first = str.ToArray().Cast<char?>().Where(
    c => !list.Contains(c.Value)).FirstOrDefault();

如果没有匹配则首先为null。这也可以写成:

var query = from char c in str
            where !list.Contains(c)
            select (char?)c;
char? first = query.FirstOrDefault();

答案 2 :(得分:1)

效率不高,但是:

char f(string str, IEnumerable<char> list)
{
  return str.ToCharArray().First(c => !list.Contains(c))
}

答案 3 :(得分:1)

这个C / C ++示例是否适合您:

char *strToSearch = "This is the one liner you want"
char *skipChars = "Tthise";
size_f numToSkip = strcspn(strToSearch, skipChars);

strcspn()函数扫描字符串以查找指定集的补集。它返回 not 中包含字符集的初始字符数。