在C#中使用LINQ比较字符串

Tho*_*eld 0 c# linq

我有两个字符串

喜欢

  "0101000000110110000010010011" and
  "0101XXXXXXX101100000100100XX"
Run Code Online (Sandbox Code Playgroud)

它应该比较每个字符,不应该考虑字符是否为X.

对于上面两个字符串,结果是真的.

现在我正在使用

迭代字符串的长度并用X替换第一个字符串中的相应字符

有什么方法可以使用LINQ来做到这一点

Jon*_*eet 5

这在.NET 4中相当容易,Zip方法如下:

using System;
using System.Linq;

class Test
{
    static void Main()
    {
        string a = "0101000000110110000010010011";
        string b = "0101XXXXXXX101100000100100XX";

        var equal = !(a.Zip(b, (x, y) => new { x, y })
                       .Where(z => z.x != z.y && z.x != 'X' && z.y != 'X')
                       .Any());

        Console.WriteLine(equal);
    }
}
Run Code Online (Sandbox Code Playgroud)

这基本上将两个字符串拉到一起(将它们视为字符序列),因此我们最终得到了对的序列.然后我们尝试找到值不同的任何对,并且值都不是'X'.如果存在任何这样的对,则字符串不相等; 否则他们是平等的.

编辑:进一步思考,我们可以反转谓词并使用All:

var equal = a.Zip(b, (x, y) => new { x, y })
             .All(z => z.x == z.y || z.x == 'X' || z.y == 'X');
Run Code Online (Sandbox Code Playgroud)

如果你不使用.NET 4,你可以使用Zip 的MoreLINQ实现,它基本上允许你做同样的事情.

或者,您可以使用它们的索引器压缩字符串,如下所示:

var equal = Enumerable.Range(0, a.Length)
                      .Select(i => new { x = a[i], y = b[i] })
                      .All(z => z.x == z.y || z.x == 'X' || z.y == 'X');
Run Code Online (Sandbox Code Playgroud)

这感觉好像有点作弊,但它确实有效.请注意,在所有这些示例中,我假设您已经检查过输入字符串的长度是否相同.

  • @Ramesh:这取决于你的表现*要求*.与最快的解决方案相比,您的解决方案速度不是很快.*但是,如果它不是非常快,那么谁在乎?*说明您的性能要求,然后测量您的代码,看看您是否满足它. (2认同)