Jag har ett problem som jag grubblat på en längre tid. Eftersom jag inte har nån kod så försöker jag förklara problemet med ett exempel. Hej. eller bygg en egen collection .. ärv från Ienumarotr och IEnumrabel, eller implementera ICollection ... Är inte säker på vad ni menar, är ganska ny på C# och har inte exprementerat så djupt i .Net framework än (har nyligen gått över från vb.net till C#). Jag fråga även min lite bättre kollega om han förstod, men han sa att det var överkurs. Hej. Beroende på vad du vill göra med objekten så kan du lagra datan på olika sätt. Det brukar visa sig (för mig iallafall) att det är hur du vill hämta elementen ur datastrukturen som avgör vilken lösning man ska välja av nedanstående. Om du näjer dig med att loppa igenom elementen från början till slut så räcker det med en array av Cars, men om du i st bara kommer att leta efter enstaka objekt via en nyckel (t ex registreringsnummer) så är Hashtable:s bättre lösning, o s v... Jag har exprementerat en del men tyvärr så får jag inte fram det jag vill ha. Har du någon vettig nyckel att använda? Typ reg nr eller dylikt? Tack Hultan och andra ni andra, det funkar perfekt.loopa igenom alla object
I en bilfabrik så tillverkas det nya bilar varje dag. Det är olika från dag till dag och alla bilar har olika egenskaper (så som färg, märke osv).Jag vill sedan på slutet av dagen vill se vilka bilar vi gjort under dagen.
Jag har en car class som alla objekt (bilar) skapas ifrån och i slutet vill jag loopa igenom alla objekt som skapats genom car. Hur gör man det?Sv: loopa igenom alla object
När du skapar objekt av klassen car, lägg referenser till dessa i en array eller en collection.
Då har du referenser till alla skapade bilar under dagen.
//freddaSv: loopa igenom alla object
Sv: loopa igenom alla object
*edit*
Efter ha grubblat ett par timmar till så kom jag fram till detta:
<code>
Car car = new Car();
ArrayList array = new ArrayList();
array.Add(car);
</code>
Är det så ni menar? Och om det är så, hur ska jag använda mig av det?Sv: loopa igenom alla object
Precis så ja.
Om du istället för en ArrayList använder t.ex Hashtable kan du också lägga till ett unikt värde till ditt objekt för att kunna plocka ut bara det ur samlingen.
När du sedan vill titta på alla bilarna bör det se ut liknande detta:
foreach (car c in myCarArray)
{
MessageBox.Show(c.toString());
}
//freddaSv: loopa igenom alla object
Jag försöker sammanfatta lite av vad de andra svarat och vad du redan kommit fram till och lite egna tankar om de olika lösningarna:
1) Använda ArrayList, Collections
Fördel : Enkel att jobba med
Nackdel : Ej typad (returnerar Object), dvs du får typkonvertera till och från typen Car innan du kan använda objektet.
2) Använda Hashtable.
Fördel : Enkel att jobba med, supersnabbt att hitta specifika objekt om du har en vettig nyckel på alla objekt (t ex registreringsnummer, karossnummer, tillverkningsnummer el dyl)
Nackdel : samma som arraylist
3) Använda en vanlig array av Car:s
Fördel : Typad och klar. Minneseffektiv, nästan ingen overhead alls
Nackdel : Du får skriva egen logik för att hitta specifika objekt om du inte nöjer dig med att loopa igenom listan från början till slut.
4) Diverse olika varianter med Arv och Interface (CollectionBase, IEnumerable m m)
Fördel : Du får typade datastrukturer med samma fördelar som Hashtabels,Collections, ArrayLists men utan dess nackdelar.
Nackdel : Mer kod att skriva själv...
Det finns säkert fler alternativ, men detta är nog tillräckligt för att visa att det inte finns en bästa lösning. Du får helt enkelt göra en avvägning mellan prestanda vid sökningar, minneseffektivitet (prestande vid extremt många element), utvecklingstid, bekvämlighet o s v...
/Per HultqvistSv: loopa igenom alla object
Jag vill kunna arbeta med en speciell bil och dess egenskaper den fått. Ex. om jag har en bil som har fått röd färg men sedan så ska den lackas om till Gul.Sv: loopa igenom alla object
I såfall låter det som om du ska använda en HashTable, som någon föreslog.
<code>
HashTable mCars=new HashTable();
mCars.Add(car1,"ABC123"); // lägg till 3 Car-objekt, car1, car2 och car3
mCars.Add(car2,"DEF456");
mCars.Add(car3,"GHI789");
</code>
För att ändra egenskaper på en speciell bil, via dess registreringsnummer :
<code>
Car mCar=(Car)mCars["DEF456"];
mCar.Color=System.Color.Yellow; // Eller:
((Car)mCars["DEF456"]).Color=System.Colors.Yellow;
</code>
Du måste typkonvertera till Car eftersom HashTable returnerar Object och inte Car. Detta kan du undvika genom att ärva eller kapsla in en HashTable i en egen klass, men det är inte nödvändigt.
/Per HultqvistSv: loopa igenom alla object
Det ända jag fick ändra var att byta plats på Nyckeln och värdet när man lade till information:
mCars.Add("ABC123", car1);
Tack än en gång!