我有两个数组,例如:
string[] a = { "a", "b", "c" };
string[] b = { "a", "b", "c" };
我需要使用LINQ比较这两个数组。
当且仅当两个数组具有相同的大小时,才应进行比较。如果a []和b []的所有值都相同,则可以任意排列数据并仍然返回true。
我有两个数组,例如:
string[] a = { "a", "b", "c" };
string[] b = { "a", "b", "c" };
我需要使用LINQ比较这两个数组。
当且仅当两个数组具有相同的大小时,才应进行比较。如果a []和b []的所有值都相同,则可以任意排列数据并仍然返回true。
string[] a = { "a", "b" };
string[] b = { "a", "b" };
return (a.Length == b.Length && a.Intersect(b).Count() == a.Length);
进行了一些性能测试:
return (a.Length == b.Length && a.Intersect(b).Count() == a.Length)
,但这只是我的看法。 - ZombieSheepa.Intersect(b).Count()
只能确保它们具有相同的元素,而不检查顺序。 - Dan Tao不确定性能如何,但这似乎有效。
string[] a = { "a", "b", "c" };
string[] b = { "a", "b", "c" };
bool result = a.SequenceEqual(b);
Assert.AreEqual(true, result);
然而,它不是无序的,因此它不符合原始问题的要求。
string[] a = { "a", "b", "c" };
string[] b = { "a", "c", "b" };
bool result = a.SequenceEqual(b);
Assert.AreEqual(false, result);
我认为这将始终是O(n log n)的操作,所以我会将两个数组排序并进行比较,例如使用SequenceEqual。
如果顺序无关或者允许重复,那么也许可以这样:
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);
一些使用案例:
different lengths (expect false)
string[] a = { "a", "b", "c" };
string[] b = { "b", "c" };
different order (expect true)
string[] a = { "a", "b", "c" };
string[] b = { "b", "c", "a" };
如果输入可以包含重复项,则也适用,尽管从问题中无法确定是否需要该特性,请考虑以下内容:
duplicated items have same count (expect true)
string[] a = { "a", "b", "b", "c" };
string[] b = { "a", "b", "c", "b" };
duplicated items with different counts (expect false)
string[] a = { "a", "b", "b", "b", "c" };
string[] b = { "a", "b", "c", "b", "c" };
a.Length == b.Length && !a.Where((t, i) => t != b[i]).Any()
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)));