Порівняння двох одновимірних масивів c # - stack overflow російською

День добрий, ситуація наступна:

  • копіюємо масив, в складі якого N рядків StringBuilder
  • в спочатку масиві, в кожному рядку виробляємо заміну ГО на ++
  • перевіряємо скопійований масив з початкового масиву, зі зміненим масивом.

навіть якщо заміна не проводиться, тобто умов для заміни немає, при порівнянні підсумкових масивів повертається false

Чому? Що такого робить Replace крім як пошуку і заміни?

Щоб порівняти елементи масивів використовуйте хоча б Enumerable.SequenceEqual:

bool isEqual = Enumerable.SequenceEqual (target1, target2);

Однак, зверніть вінманіе, що в вашому коді є ще одна проблема. Коли ви копіюєте посилання на StringBuilder. а потім міняєте значення вмісту StringBuilder за допомогою методу Replace. то змінюються дані об'єкта, на який сслается і перший масив і копія.

Правильніше сказати, що ви не створюєте копію набору StringBuilder. ви створюєте копію посилань на них.

Не плутайте StringBuilder.Replace і string.replace. Це абсолютно різні речі. StringBuilder.Replace змінює вміст себе і повертає посилання на себе ж, незалежно від того, знайшлося щось для заміни чи ні. string.replace створює новий рядок і повертає посилання на неї, якщо знайшлося що поміняти, а якщо не знайшлося, то повертає посилання на себе.

Якби ви працювали з масивами посилань на System.String. то у ваш код заробив би як очікувалося.

Якщо працювати треба саме з класом StringBuilder то при створенні копії треба використовувати щось на зразок:

Зверніть увагу, що при такій тактиці, ви будете схильні до ще однієї потенційну проблему. А саме, метод StringBuilder.Equals порівнює не тільки рядок, яка в ньому зберігається, але так само властивості Capacity. і MaxCapacity. які можуть змінюватися в процесі маніпуляцій з рядками усередині StringBuilder.

У вашому прикладі, коли вихідна рядок піддається тільки одному нехитрому зміни, ця проблема може вас і не торкнеться, але це бомба уповільненої дії. Не робіть так. Будь-який грамотний програміст побачить цей код і складе про вас нелецепріятное думку.

відповідь даний 12 Вересня '16 о 16:17