Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较2个字符串数组_C#_Data Structures_Collections - Fatal编程技术网

C# 比较2个字符串数组

C# 比较2个字符串数组,c#,data-structures,collections,C#,Data Structures,Collections,我想以最快的方式比较两个字符串数组。 我得到了下面的东西。 这是正确的做法吗。还是有更好的方法 bool matching=false; //say templateArr is the template array and dataArr as array to be compared string[] templateArr = {"Dictionary_type","Translation_EN" };

我想以最快的方式比较两个字符串数组。
我得到了下面的东西。

这是正确的做法吗。还是有更好的方法

            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;

您正在创建一个
联合
,然后只使用其中一个来计算总元素数
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;
string[]templateArr={“Dictionary\u type”,“Translation\u EN”};
字符串[]dataArr={“Dictionary\u type”,“Translation\u EN”};
布尔匹配=模板阵列长度==数据阵列长度!templateArr.Any(x=>!dataArr.Contains(x)):false;

要测试集合相等性,可以使用以下方法

using System.Linq;

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

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

    return new HashSet<string>(templateArr).SetEquals(dataArr);
}
如果您想测试集合等价性(元素的顺序无关紧要),那么您可以使用如下方法

using System.Linq;

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

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

    return new HashSet<string>(templateArr).SetEquals(dataArr);
}
bool areevalent()
{
string[]templateArr={“Dictionary\u type”,“Translation\u EN”};
字符串[]dataArr={“Dictionary\u type”,“Translation\u EN”};
返回新的HashSet(templateArr).SetEquals(dataArr);
}

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

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

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

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;
或者(更简洁,可能更快):


根据前面的评论,这个问题有点模棱两可,因为您没有澄清等价数组的组成部分,但是假设在我使用HashSet(array1).SetEquals(array2)之前,如果数组包含相同数量的相同字符串(以任何顺序),您将数组视为相等的

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

  • 比较长度,如果长度不同-返回false 排序数组,将计数器设置为0
  • 比较数组[0]元素-如果不同,则返回false
  • 使用索引,而不是foreach,对下一个重复此过程
  • 返回真值

  • 对于大型数组,使用这种方法-您可能会发现差异,而不是实际在内存中加载数组,或者依赖哈希设置整个数组,因此获得更高效的性能/内存消耗

    当您说“比较”时,您的意思是它们必须具有相同的字符串?以你目前的例子,我认为他们是平等的。但是,如果
    dataArr
    还有一个(比如说,“测试”),结果应该是什么?我认为通过比较它们来澄清你的意思会更有帮助。您想知道它们是否都包含某个元素吗?如果它们有相同数量的条目?如果它们有相同的元素,但顺序不同怎么办?e、 {“Foo”,“Bar”}等同于{“Bar”,“Foo”}吗?我认为这是一个非常好的方法,很容易去~不同的顺序是好的。但是数组元素必须相等,对于大型数组来说性能不是很好-本质上是一个嵌套循环。再说一次,它可能在小型阵列上运行得很好。@BrankoDimitrijevic我明白了,但既然我们正在使用阵列,您有更好的建议吗?反馈将不胜感激。是的,对于更大的数组,事先对数组进行排序或将它们放入哈希集中是合理的。我更喜欢添加这个附加条件,如果(templateArr.Length!=dataArr.Length)matching=false;是的,看起来有点像expensive@sankaras这个条件已经存在,见三元运算符。比我的好得多,+1。但它们应该是
    bool
    而不是
    void
    ,对吗?在void方法中,我们不能返回任何内容。
    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;