Я не могу гарантировать, что это быстрый, но это, конечно, весьма эффективно:
bool areEquivalent = array1.Length == array2.Length
&& new HashSet<string>(array1).SetEquals(array2);
EDIT: SaeedAlg и Sandris поднять действительные пункты о различных частотах дублей, вызывающих проблемы с этим подходом. Я вижу два обходных решения, если это важно (не придали большого значения их соответствующей эффективности):
1. Содержите массивы, а затем последовательно сравните их. Такой подход теоретически должен иметь квадратичную сложность в худшем случае. т.д .:
return array1.Length == array2.Length
&& array1.OrderBy(s => s).SequenceEqual(array2.OrderBy(s => s));
2.Build вверх частотную таблицу строк в каждом массиве, а затем сравнить их. Например:
if(array1.Length != array2.Length)
return false;
var f1 = array1.GroupBy(s => s)
.Select(group => new {group.Key, Count = group.Count() });
var f2 = array2.GroupBy(s => s)
.Select(group => new {group.Key, Count = group.Count() });
return !f1.Except(f2).Any();
Br illiant, thanks :) – izb
Это как @Albin Sunnanbo ответ может быть, вы вернетесь, два массива равны, и они не равны. –
@SaeedAlg: Можете ли вы привести пример? – Ani