检查两个字符串数组的等价性

时间:2010-07-14 21:57:29

标签: c#

有没有更好的方法来检查两个字符串数组是否具有相同的内容?

string[] first = new string[]{"cat","and","mouse"};
string[] second = new string[]{"cat","and","mouse"};

bool contentsEqual = true;

if(first.Length == second.Length){
    foreach (string s in first)
    {
        contentsEqual &= second.Contains(s);
    }
}
else{
    contentsEqual = false;
}


Console.WriteLine(contentsEqual.ToString());//    true

5 个答案:

答案 0 :(得分:6)

Enumerable.SequenceEquals如果他们应该按照相同的顺序。

答案 1 :(得分:2)

您应该考虑使用intersect方法。它将为您提供所有匹配值,然后您可以将结果数组的计数与被比较的数组进行比较。

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx

答案 2 :(得分:2)

这是O(n^2)。如果数组具有相同的长度,则对它们进行排序,然后比较相同位置的元素。这是O(n log n)

或者您可以使用hash setdictionary:在第一个数组中插入每个单词,然后查看第二个数组中的每个单词是否在集合或字典中。这平均为O(n)

答案 3 :(得分:1)

该方法的逻辑没有错,但是您在第一个序列中为每个项目测试Contains这一事实意味着该算法通常在O(n^2)时间内运行。您还可以进行一两个其他较小的优化和改进

我会实现如下功能。这样定义一个扩展方法(例如在.NET 4.0中)。

public static bool SequenceEquals<T>(this IEnumerable<T> seq1, IEnumerable<T> seq2)
{
    foreach (var pair in Enumerable.Zip(seq1, seq2)
    {
        if (!pair.Item1.Equals(pair.Item2))
            return;
    }
    return false;
}

答案 4 :(得分:1)

您可以尝试Enumerable.Intersect:http://msdn.microsoft.com/en-us/library/bb460136.aspx

操作的结果是两个数组共有的每个元素。如果结果的长度等于两个数组的长度,则两个数组包含相同的项。

Enumerable.Union:http://msdn.microsoft.com/en-us/library/bb341731.aspx也会奏效;只需检查Union操作的结果是否为零(意味着没有元素只对一个数组唯一);

虽然我不确定函数如何处理重复项。