代码之家  ›  专栏  ›  技术社区  ›  Thorin Oakenshield

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

  •  0
  • Thorin Oakenshield  · 技术社区  · 14 年前

    就像

      "0101000000110110000010010011" and
      "0101XXXXXXX101100000100100XX"
    

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

    现在我用的是

    遍历字符串的长度并用X替换第一个字符串中对应的字符

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

    4 回复  |  直到 14 年前
        1
  •  5
  •   Jon Skeet    14 年前

    在.NET4中,使用 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);
        }
    }
    

    编辑:进一步考虑,我们可以反转谓词并使用 All 取而代之的是:

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

    MoreLINQ Zip的实现,基本上可以让你做同样的事情。

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

    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');
    

    这感觉有点作弊,但确实有效。注意,在 全部的 在这些示例中,我假设您已经检查了输入字符串的长度是否相同。

        2
  •  4
  •   LukeH    14 年前

    你可以创造一个 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();
        }
    }
    
        3
  •  0
  •   RameshVel    14 年前

    这应该管用。

            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
    
        4
  •  -1
  •   Jouke van der Maas    14 年前

    不管怎样,只要把它们做成char数组并执行以下操作:

    arrayOne.Distinct(arrayTwo).ToArray().Length == 0
    

    编辑: