2010-07-14 2 views
2

Есть ли лучший способ проверить, имеют ли два строковых массива одинаковое содержимое, чем это?Рассмотрение двух строковых массивов для эквивалентности

string[] first = new string[]{"cat","and","mouse"}; 
string[] second = new string[]{"cat","and","mouse"}; 

bool contentsEqual = true; 

if(first.Length == second.Length){ 
    foreach (string s in first) 
    { 
     contentsEqual &= second.Contains(s); 
    } 
} 
else{ 
    contentsEqual = false; 
} 


Console.WriteLine(contentsEqual.ToString());// true 
+0

Ваш метод не работает для сравнения массивов «cat», «dog», «dog» и «cat», «cat», «dog». –

+0

Исправление, 'да', вы правы, спасибо :) – Grokodile

+0

Возможный дубликат [Есть ли встроенный метод сравнения коллекций в C#?] (Http://stackoverflow.com/questions/43500/is-there-a -built-in-method-to-compare-collections-in-c) – nawfal

ответ

6

Enumerable.SequenceEquals если они должны быть в том же порядке.

+0

Darn, даже не знал об этой функции hah! Или забудь об этом, по крайней мере. Один из этих небольших скрытых бит в .NET 3.5. Я бы пошел и добавлю его в поток .NET Hidden Gems прямо сейчас, если бы у меня было время! – Noldorin

+0

Если заказ не имеет значения, вы всегда можете сортировать оба массива, если не возражаете против дополнительных накладных расходов. –

2

Это O(n^2). Если массивы имеют одинаковую длину, отсортируйте их, а затем сравните элементы в одном и том же положении. Это O(n log n).

Или вы можете использовать hash set или dictionary: вставьте каждое слово в первый массив, а затем посмотрите, есть ли каждое слово во втором массиве в наборе или словаре. Это в среднем O(n).

+0

Метод хеш-набора не обрабатывает дубликаты правильно, если вы также не храните счет с каждым словом. –

+0

@Simon - да, лично я бы использовал словарь «». – IVlad

1

Ничего плохого в логике метода, но тот факт, что вы тестируете Contains для каждого элемента в первой последовательности, означает, что алгоритм работает в O(n^2) времени в целом. Вы также можете сделать одну или две другие небольшие оптимизации и улучшения

Я бы выполнил такую ​​функцию следующим образом. Определите метод расширения как таковой (пример в .NET 4.0).

public static bool SequenceEquals<T>(this IEnumerable<T> seq1, IEnumerable<T> seq2) 
{ 
    foreach (var pair in Enumerable.Zip(seq1, seq2) 
    { 
     if (!pair.Item1.Equals(pair.Item2)) 
      return; 
    } 
    return false; 
} 
+0

Это предполагает, что порядок элементов имеет значение, я думаю? –

1

Вы можете попробовать Enumerable.Intersect: http://msdn.microsoft.com/en-us/library/bb460136.aspx

Результатом операции является каждый элемент, который является общим для обоих массивов. Если длина результата равна длине обоих массивов, то два массива содержат одни и те же элементы.

Enumerable.Union: http://msdn.microsoft.com/en-us/library/bb341731.aspx будет работать; просто убедитесь, что результат операции Union имеет длину 0 (это означает, что нет элементов, которые уникальны только для одного массива);

Хотя я не совсем уверен, как функции обрабатывают дубликаты.

Смежные вопросы