există o modalitate de a trata matrice ac # statică ca un ArrayList?

voturi
2

Am cod care utilizează Arrays și, din păcate, eu nu pot schimba tipurile lor. Dacă aș putea, aș folosi ArrayLists sau ceva de simliar pentru a face ceea ce trebuie să fac, dar nu pot. Practic, eu sunt în căutarea pentru cea mai bună abordare pentru adăugarea și eliminarea obiectelor dintr-o matrice statică. Pentru a adăuga un element la matrice pe zbor, am pentru a crea o nouă matrice, care este un element mai mare decât matrice vechi, copiați elementele din matrice vechi în noua matrice, și adăugați elementul nou. ceva de genul...

public partial class dataStruct 
{
    private myObject[] myStaticArray;
};

private void AddItemToMyArray()
{
    int oldLength = dataStruct.myStaticArray.Length;
    myObject[] newMyObjectArray = new myObject[oldLength + 1];
    for (int i = 0; i < oldLength; i++)
       newMyObjectArray [i] = dataStruct.myStaticArray[i];

    dataStruct.myStaticArray[oldLength] = new myObject();
    dataStruct.myStaticArray = newMyObjectArray;
}

pentru ștergerea unui element, am face același lucru, doar am crea o nouă matrice, care este un element mai mic. acest lucru se simte foarte ineficient. poate cineva sugera o abordare mai bună, dacă există unul? sau orice alte gânduri?

Vă mulțumim anticipat pentru ajutorul acordat!

Întrebat 12/03/2009 la 14:59
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
3

De ce doriți să utilizați o matrice aici? Treceți la List<T>, sau (dacă aveți nevoie de mutări eficiente / inserții din mijloc) A LinkedList<T>.

Nu sunt sigur dacă înseamnă „statică“ în modul în care am să spun - poți clarifica?

Pentru informatii, puteți utiliza Array.Resize(ref myArray, newSize), dar că nu este răspunsul corect pentru schimbări frecvente.

Publicat 12/03/2009 la 15:02
sursa de către utilizator

voturi
6

Nu - matrice sunt întotdeauna o dimensiune fixă. Nu puteți adăuga / șterge intrările din ele.

Aceasta este exact restricția ca ArrayListși a List<T>lucra în jurul valorii, în mod eficient. Ei mențin o matrice pe plan intern, dar care este de obicei mai mare decât dimensiunea logică a listei. Atunci când adăugați un element la o List<T>va popula matrice existentă în cazul în care se poate, sau în cazul în care nu există suficient spațiu va crea o nouă matrice, mai mare și copiați conținutul în ea. Această modificare este transparent apelantului , deși - puteți utiliza în continuare referința originală, pentru că este o trimitere la listă și nu la matrice de bază.

Un lucru care va face codul mai simplu (dar , probabil , nu mai eficient) este de a utiliza Array.Resize . Aceasta nu redimensiona existent matrice, dar returnează o nouă matrice cu o copie superficială a conținutului vechi, la dimensiunea solicitați. Copierea poate fi un pic mai repede decât cu o buclă manuală, dar principala cauză a ineficienței este încă acolo.

Publicat 12/03/2009 la 15:03
sursa de către utilizator

voturi
0

Scrii practic propria listă, dar într-un mod mai puțin eficient.

Listă face intern ceea ce descrie, dar cu o diferență mare în ceea ce privește performanța.

Când a realoca matrice sale interne, nu adaugă doar un element nou, se adaugă un bloc de ele. În acest fel, în viitor, adaugă nu necesită întotdeauna realocarea. Aceasta este lista de „capacitate“ - și de ce capacitatea de listă este întotdeauna> = dimensiunea lista lui.

Dacă trebuie să faceți acest lucru, mi-ar recomanda a face ceva similar. Cu toate acestea, trecerea la lista ar fi o opțiune mult mai bună.

Publicat 12/03/2009 la 15:04
sursa de către utilizator

voturi
0

Orice lucru care le puteți face pentru a face o matrice mai mult ca un ArrayListsau List<T>este pur și simplu va va face să se încheie re de punere în aplicare o parte (sau toate) din aceste clase. Cea mai bună este de a utiliza cel mai bine clasele încorporate, ca și celelalte răspunsuri au declarat.

Publicat 12/03/2009 la 15:05
sursa de către utilizator

voturi
2

Din sunetele de ea nu se poate schimba structura de date astfel încât trebuie să se ocupe cu matrice.

Singurul lucru pe care îl puteți obține ajutor pe într-adevăr este că puteți evita bucla și de a face o Array.copy

int oldLength = dataStruct.myStaticArray.Length;
myObject[] newMyObjectArray = new myObject[oldLength + 1];
Array.copy(dataStruct.myStaticArray, newMyObjectArray, oldLength);

dataStruct.myStaticArray[oldLength] = new myObject();
dataStruct.myStaticArray = newMyObjectArray;

EDIT De fapt, acest lucru ar putea să funcționeze:

int oldLength = dataStruct.myStaticArray.Length;
Array.Resize(dataStruct.myStaticArray, oldLength+1);
Publicat 12/03/2009 la 15:09
sursa de către utilizator

voturi
3

Din păcate, eu nu pot schimba tipurile lor

De ce nu? Singurul răspuns rezonabil este că aveți un API , trebuie să utilizați cu funcții care să le returneze sau să le cer ca parametri. În acest caz, utilizați List<T>și de apel este .ToArray()sau .AddRange()metode după cum este necesar.

Publicat 12/03/2009 la 15:24
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more