Возможно, вам нужно использовать более низкую версию Gradle в вашем файле build.gradle уровня проекта. Например, для Android N попробуйте использовать:
classpath 'com.android.tools.build:gradle:2.14.1'
string[] a = { "a", "b" };
string[] b = { "a", "b" };
return (a.Length == b.Length && a.Intersect(b).Count() == a.Length);
После некоторого тестирования производительности:
Не уверен насчет производительности, но, похоже, это работает.
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);
Если порядок не имеет значения или могут быть дубликаты, то возможно:
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" };
Это работает правильно с дубликатами и проверяет каждый элемент
a.Length == b.Length && !a.Where((t, i) => t != b[i]).Any()
Я думаю, что это всегда будет операция O(n log n), поэтому я бы просто отсортировал оба массива и сравнил их, например, используя SequenceEqual.