我有两个字符串
像
"0101000000110110000010010011" and
"0101XXXXXXX101100000100100XX"
它应该比较每个字符,不应该考虑字符是否为X
对于上述两个字符串,结果为真。
现在我正在使用
迭代字符串的长度并用X
替换第一个字符串中的相应字符有没有办法使用LINQ
来做到这一点答案 0 :(得分:5)
使用Zip
方法在.NET 4中相当容易:
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');
感觉它有些作弊,但它有效。请注意,在这些示例的 all 中,我假设您已经检查过输入字符串的长度是否相同。
答案 1 :(得分:4)
您可以创建custom comparer,然后使用SequenceEqual
方法:
string s1 = "0101000000110110000010010011";
string s2 = "0101XXXXXXX101100000100100XX";
bool areEqual = s1.SequenceEqual(s2, new IgnoreXEqualityComparer()); // True
// ...
public class IgnoreXEqualityComparer : EqualityComparer<char>
{
public override bool Equals(char x, char y)
{
return (x == 'X') || (y == 'X') || (x == y);
}
public override int GetHashCode(char obj)
{
throw new NotImplementedException();
}
}
答案 2 :(得分:0)
这应该有效。
var a1 = "0101000000110110000010010011";
var a2 = "0101XXXXXXX101100000100100XX";
var notmatched = a2.Select((cha, idx) =>
{
if (cha != 'X')
return (cha == a1[idx]) ? true : false;
else
return true;
}).Any(x => x == false);
if (notmatched)
//strings are not match
else
//strings are match
答案 3 :(得分:-1)
如果你没有X,我就会知道。然而,对于X,你不能用我知道的Linq做这件事。
无论如何,只需将它们设为char数组即可:
arrayOne.Distinct(arrayTwo).ToArray().Length == 0
编辑: 刚发生在我身上,您可以检查该结果是否仅包含X.如果是,则返回true。