比较2个字符串数组

时间:2012-08-21 01:25:19

标签: c# data-structures collections

我希望以最快的方式比较2个字符串数组 我得到的东西如下。

这是正确的做法吗?或者有更好的方法吗

            bool matching=false;
            //say templateArr is the template array and dataArr as array to be compared
            string[] templateArr = {"Dictionary_type","Translation_EN" };
            string[] dataArr = { "Dictionary_type", "Translation_EN" };

            if (templateArr.Union(dataArr).Distinct().Count() == templateArr.Count())
                matching = true;

4 个答案:

答案 0 :(得分:5)

要测试集合相等性,可以使用Enumerable.SequenceEquals,如下所示。

using System.Linq;

bool AreEqual()
{
    string[] templateArr = { "Dictionary_type", "Translation_EN" };
    string[] dataArr = { "Dictionary_type", "Translation_EN" };

    return templateArr.SequenceEquals(dataArr);
}

如果要测试集合等价性(元素的顺序无关紧要),则可以使用set-equality,如下所示。

bool AreEquivalent()
{
    string[] templateArr = { "Dictionary_type", "Translation_EN" };
    string[] dataArr = { "Dictionary_type", "Translation_EN" };

    return new HashSet<string>(templateArr).SetEquals(dataArr);
}

根据MSDN文档,这两种情况都是按线性时间实现的。

答案 1 :(得分:0)

您正在制作union,然后仅使用其中一个来计算总元素。 Union删除了重复,但我不确定这是否是最好的方法,因为这是一个相对昂贵的操作。

看看这个替代方案:

        string[] templateArr = { "Dictionary_type", "Translation_EN" };
        string[] dataArr = { "Dictionary_type", "Translation_EN" };

        bool matching = templateArr.Length == dataArr.Length ? !templateArr.Any<string>(x => !dataArr.Contains(x)) : false;

答案 2 :(得分:0)

假设如果它们具有相同的元素但顺序不同,则应视为不相等,您可以使用SequenceEqual

if (templateArr.SequenceEqual(dataArr))
    matching = true;

如果要忽略该顺序,请先对数组进行排序:

if (templateArr.OrderBy(x => x).SequenceEqual(dataArr.OrderBy(x => x)))
    matching = true;

如果您还想忽略重复项:

if (templateArr.Distinct().OrderBy(x => x).SequenceEqual(dataArr.Distinct().OrderBy(x => x)))
    matching = true;

或者(更简洁,也可能更快):

if (new HashSet<string>(templateArr).SetEquals(dataArr))
    matching = true;

顺便说一下,你的代码不正确 - 在这种情况下,它会得出结论:

string[] templateArr = { "Dictionary_type", "Translation_EN", "abc" };
string[] dataArr = { "Translation_EN", "Dictionary_type", "Translation_EN" };

if (templateArr.Union(dataArr).Distinct().Count() == templateArr.Count())
    matching = true;

答案 3 :(得分:0)

根据之前的评论 - 问题稍微有些模糊,因为你没有说明构成等效数组的内容,但假设你将数组视为等价的,如果它们包含相同数量的相同字符串(按任意顺序),我会求助于HashSet(array1).SetEquals(array2);

我会尝试使用以下简单技术确定数组是否相等:

  1. 比较长度,如果长度不同 - 返回false 排序数组,将计数器设置为0
  2. 比较array [0]元素 - 如果不同则返回false
  3. 使用索引而不是foreach
  4. 为每个下一个重复此过程
  5. 返回true
  6. 对于大型数组采用这种方法 - 您可能会发现差异而不是实际在内存中加载数组或依赖于对整个数组进行哈希设置,从而获得更高效的性能/内存消耗