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

时间:2010-07-21 12:18:54

标签: c# linq

我有两个字符串

  "0101000000110110000010010011" and
  "0101XXXXXXX101100000100100XX"

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

对于上述两个字符串,结果为真。

现在我正在使用

迭代字符串的长度并用X

替换第一个字符串中的相应字符

有没有办法使用LINQ

来做到这一点

4 个答案:

答案 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。