Compararea de matrice bidimensionale c # - preaplin stivă în limba rusă

Buna ziua, situația este următoarea:

  • copie matrice compusă din N linii care StringBuilder
  • inițial în matrice, fiecare linie face ETE înlocuire în ++
  • verifica matrice copiate cu matrice original, cu o matrice modificată.

chiar dacă schimbarea nu se face, de exemplu, condițiile de înlocuire nu este prezent, comparația returnează matrice rezultate false

De ce? Ce înseamnă aceasta, ci numai Replace de căutare și înlocuire?

Pentru a compara elementele de matrice, folosind cel puțin Enumerable.SequenceEqual:

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

Cu toate acestea, vă rugăm să vinmanie că în codul dvs. există o altă problemă. Când copiați un link către StringBuilder. și apoi modificați valoarea cu ajutorul conținutului StringBuilder metodei Replace. obiectul de schimbare a datelor, care sslaetsya și prima matrice și copie.

Corect să spunem că nu creați un set copie de StringBuilder. creați o copie a trimitere la acestea.

A nu se confunda StringBuilder.Replace și string.replace. Acestea sunt lucruri complet diferite. StringBuilder.Replace schimba conținutul în sine și returnează o referință la aceeași chestiune, a găsit ceva pentru a înlocui sau nu. string.replace creează un nou șir de caractere și returnează o referință la aceasta, în cazul în care a existat o schimbare care, și în cazul în care nu a fost găsit, returnează o referință la sine.

Dacă lucrați cu o serie de referiri la System.String. atunci codul ar fi câștigat cum era de așteptat.

Dacă este necesar să se lucreze cu clasa StringBuilder când se creează copii ar trebui să folosească ceva de genul:

Rețineți că, cu astfel de tactici, va fi expus o altă problemă potențială. Și anume, metoda StringBuilder.Equals compară nu numai șirul pe care este stocat în el, dar, de asemenea, proprietățile de capacitate. și MaxCapacity. care se pot schimba în timpul șirurile de manipulare din interiorul StringBuilder.

În exemplul dvs., atunci când șirul sursă este supus la o singură modificare necomplicat, problema ar putea tine și nu ar afecta, dar este o bombă cu ceas. Nu face asta. Orice programator competentă vede acest cod și va face din tine aviz neletsepriyatnoe.

Răspuns 12 '16 septembrie la 16:17

articole similare