我知道我可以遍历字符串或构建正则表达式或反转集合(毕竟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。
答案 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 中包含字符集的初始字符数。