这在 .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);
}
}
这基本上将两个字符串压缩在一起(将它们视为字符序列),因此我们最终得到成对序列。然后,我们尝试找到值不同且两个值都不是“X”的任何对。如果存在任何这样的对,则字符串不相等;否则他们是平等的。
编辑:进一步考虑,我们可以反转谓词并改用All:
var equal = a.Zip(b, (x, y) => new { x, y })
.All(z => z.x == z.y || z.x == 'X' || z.y == 'X');
如果您不使用 .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');
感觉有点作弊,但确实有效。请注意,在所有这些示例中,我假设您已经检查了输入字符串的长度是否相同。