我有两个数组,比如
string[] a = { "a", "b", "c" };
string[] b = { "a", "b", "c" };
我需要使用LINQ比较两个数组。
仅当两个阵列具有相同大小时才应进行比较。数据可以是任何顺序,如果[]的所有值和b []的所有值都相同,则仍然返回true。
答案 0 :(得分:28)
string[] a = { "a", "b" };
string[] b = { "a", "b" };
return (a.Length == b.Length && a.Intersect(b).Count() == a.Length);
经过一些性能测试后:
答案 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()