是否可以使用LINQ来检测重复的相邻字符?

Chr*_* H. 1 c# linq

我想验证字符串是否包含相邻位置中的任何重复字符(来自一组坏字符).此主题的先前堆栈溢出答案似乎主要是一般形式:

for(int i = 0; i < testString.Length-1; i++){
    if(testString[i] == testString[i+1] && testString[i] == badChar){
        //Handle rejection here
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以在LINQ中进行此类验证/验证?更一般地说:LINQ中是否可以将字符串中每个字符的值与a中的下一个字符进行比较

testString.Any(c => /*test goes here*/) 呼叫?

Mar*_*zek 5

你可以使用PairwisemoreLINQ库:

if(testString.Pairwise((n, m) => new {n, m}).Any(x => x.n == x.m && x.n == badChar))
    // do something
Run Code Online (Sandbox Code Playgroud)

如果你想使用纯LINQ你可以使用Skip/ Zip组合破解它:

if(testString.Zip(testString.Skip(1), (n, m) => new {n, m})).Any(x => x.n == x.m && x.n == badChar))
    // do something
Run Code Online (Sandbox Code Playgroud)

但是这两种解决方案都比for基于循环的解决方案慢得多,所以我建议不要这样做.


Iva*_*oev 5

只要您有一个具有Count(或等效)属性和索引器的类,您就可以用作Enumerable.RangeLINQ 查询的基础,并在索引访问中执行类似于非 LINQ 代码的操作:

bool test = Enumerable.Range(0, testString.Length - 1).Any(i = > 
        testString[i] == testString[i + 1] && testString[i] == badChar)
Run Code Online (Sandbox Code Playgroud)