在C#中使用LINQ比较数组

时间:2010-05-26 13:19:40

标签: c# linq

我有两个数组,比如

string[] a = { "a", "b", "c" };
string[] b = { "a", "b", "c" };

我需要使用LINQ比较两个数组。

仅当两个阵列具有相同大小时才应进行比较。数据可以是任何顺序,如果[]的所有值和b []的所有值都相同,则仍然返回true。

6 个答案:

答案 0 :(得分:28)

string[] a = { "a", "b" };
string[] b = { "a", "b" };

return (a.Length == b.Length && a.Intersect(b).Count() == a.Length);

经过一些性能测试后:

  • 超过10,000个小字符串 - 5ms
  • 超过100,000个小字符串 - 99ms
  • 超过1,000,000个小字符串 - 平均601ms
  • 超过100,000~500个字符串 - 190ms

答案 1 :(得分:25)

不确定性能,但这似乎有效。

string[] a = { "a", "b", "c" };
string[] b = { "a", "b", "c" };

bool result = a.SequenceEqual(b);
Assert.AreEqual(true, result);

但是,它不是与订单无关的,因此它不符合OP的要求。

string[] a = { "a", "b", "c" };
string[] b = { "a", "c", "b" };

bool result = a.SequenceEqual(b);
Assert.AreEqual(false, result);

答案 2 :(得分:5)

我认为这将始终是一个O(n log n)操作,所以我只是对两个数组进行排序并比较它们,例如使用SequenceEqual。

答案 3 :(得分:4)

如果顺序无关紧要或者可能有重复,那么可能是:

public static class IEnumerableExtensions
{
    public static bool HasSameContentsAs<T>(this ICollection<T> source,
                                            ICollection<T> other)
    {
        if (source.Count != other.Count)
        {
            return false;
        }
        var s = source
            .GroupBy(x => x)
            .ToDictionary(x => x.Key, x => x.Count());
        var o = other
            .GroupBy(x => x)
            .ToDictionary(x => x.Key, x => x.Count());
        int count;
        return s.Count == o.Count &&
               s.All(x => o.TryGetValue(x.Key, out count) &&
                          count == x.Value);
    }
}

用法:

string[] a = { "a", "b", "c" };
string[] b = { "c", "a", "b" };

bool containSame = a.HasSameContentsAs(b);

一些用例:

  • 不同的长度(期望为假)

    string[] a = { "a", "b", "c" };
    string[] b = { "b", "c" };
    
  • 不同的顺序(期望为真)

    string[] a = { "a", "b", "c" };
    string[] b = { "b", "c", "a" };
    
如果输入可以包含重复项目,

也可以工作,但是从问题中是否需要该特征是不明确的,请考虑:

  • 重复的项目具有相同的计数(期望为真)

    string[] a = { "a", "b", "b", "c" };
    string[] b = { "a", "b", "c", "b" };
    
  • 具有不同计数的重复项目(期望为假)

    string[] a = { "a", "b", "b", "b", "c" };
    string[] b = { "a", "b", "c", "b", "c" };
    

答案 4 :(得分:3)

IDictionary<int, object> a = new Dictionary<int, object>();
IDictionary<int, object> b = new Dictionary<int, object>();
a.Add(1, "1");
a.Add(2, 2);
a.Add(3, "3");

b.Add(3, "3");
b.Add(1, "1");
b.Add(2, 2);

Console.WriteLine(a.All(i => b.Contains(i)) && b.All(i => a.Contains(i)));

答案 5 :(得分:2)

这适用于重复项并检查每个元素

a.Length == b.Length && !a.Where((t, i) => t != b[i]).Any()