если порядок не имеет значения или могут быть дубликаты, то возможно:
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" };