2

我想以最快的方式比较 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

4 回答 4

6

要测试集合相等性,您可以使用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 文档,这两种情况都是在线性时间内实现的。

于 2012-08-21T01:46:12.207 回答
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;
于 2012-08-21T01:51:28.697 回答
0

你正在制作 aunion然后只用其中一个来计算总元素。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;
于 2012-08-21T01:38:05.443 回答
0

根据之前的评论 - 这个问题有点模棱两可,因为你没有澄清什么构成等效数组,但假设你将数组视为等价,如果它们包含相同数量的相同字符串(以任何顺序),然​​后我会求助到 HashSet(array1).SetEquals(array2);

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

  1. 比较长度,如果长度不同 - 返回错误的排序数组,将计数器设置为 0
  2. 比较数组 [0] 元素 - 如果不同则返回 false
  3. 对下一个重复该过程,使用索引,而不是 foreach
  4. 返回真

使用这种用于大型数组的方法 - 您可能会发现差异,而不是实际将数组加载到内存中或依赖散列设置整个数组,从而获得更有效的性能/内存消耗

于 2012-08-21T01:58:45.177 回答