【问题标题】:Comparing two string arrays in C#在 C# 中比较两个字符串数组
【发布时间】:2013-06-17 05:28:23
【问题描述】:

假设我们有 5 个这样的字符串数组:

string[] a = {"The","Big", "Ant"};
string[] b = {"Big","Ant","Ran"};
string[] c = {"The","Big","Ant"};
string[] d = {"No","Ants","Here"};
string[] e = {"The", "Big", "Ant", "Ran", "Too", "Far"};

有没有一种方法可以将这些字符串相互比较,而无需在 C# 中循环遍历它们,这样只有 a 和 c 会产生布尔值 true?换句话说,所有元素必须相等并且数组必须相同大小?同样,尽可能不使用循环。

【问题讨论】:

标签: c# .net string linq equality


【解决方案1】:

你可以使用 Linq:

bool areEqual = a.SequenceEqual(b);

【讨论】:

  • @WesField:注意这个方法也会循环,只是因为你的要求是“不循环”。当然,不循环比较多个项目是不可能的。另请注意,它默认使用默认比较器,适用于值类型和 .NET 类型。对于自定义引用类型,您需要为SequenceEqual 创建自定义IEqualityComparer<T> 和/或覆盖EqualsGetHashCode
  • @TimSchmelter:是的,我意识到在幕后执行了一个循环,我只是想要一些整洁漂亮的东西,没有空间来做垃圾。
  • 当两个数组的值完全相同但顺序不同时返回 false。
  • “无循环”在您需要构造表达式> 时非常方便。这就是我最终为 Moq 库中的 Mock.Is 所做的。
【解决方案2】:

尝试使用Enumerable.SequenceEqual

var equal = Enumerable.SequenceEqual(a, b);

【讨论】:

  • 也是一个很好的答案。您能解释一下这与 Linq a.SequenceEqual(b) 之间的区别吗?
  • 同样的事情——一个使用扩展方法语法,另一个是显式使用扩展方法。详情看扩展方法sigmsdn.microsoft.com/en-us/library/vstudio/bb383977.aspx
  • @WesField:没有区别。扩展方法只是静态类中的静态方法。所以你可以把它当作一个普通的静态方法(这个答案)或者你把它用作扩展方法(艾哈迈德的答案)。
【解决方案3】:

如果你想获取与另一个数组不同的数组数据,你可以尝试.Except

string[] array1 = { "aa", "bb", "cc" };
string[] array2 = { "aa" };

string[] DifferArray = array1.Except(array2).ToArray();

输出: {"bb","cc"}

【讨论】:

  • string[] a = new string[] {"1","2","2"}; string[] b = new string[] {"1","2"}; string[] DifferArray = a.Except(b).ToArray();DifferArray.Length; // 0 这是坏情况
【解决方案4】:

如果您想一次性比较它们:

string[] a = { "The", "Big", "Ant" };
string[] b = { "Big", "Ant", "Ran" };
string[] c = { "The", "Big", "Ant" };
string[] d = { "No", "Ants", "Here" };
string[] e = { "The", "Big", "Ant", "Ran", "Too", "Far" };

// Add the strings to an IEnumerable (just used List<T> here)
var strings = new List<string[]> { a, b, c, d, e };

// Find all string arrays which match the sequence in a list of string arrays
// that doesn't contain the original string array (by ref)
var eq = strings.Where(toCheck => 
                            strings.Where(x => x != toCheck)
                            .Any(y => y.SequenceEqual(toCheck))
                      );

返回两个匹配项(您可以扩展它以排除我认为已经匹配的项目)

【讨论】:

  • 谢谢,这次可能不会使用它,但这是一个不错的选择。
【解决方案5】:
        if (a.Length == d.Length)
        {
            var result = a.Except(d).ToArray();
            if (result.Count() == 0)
            {
                Console.WriteLine("OK");
            }
            else
            {
                Console.WriteLine("NO");
            }
        }
        else
        {
            Console.WriteLine("NO");
        }

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多