webForumDet fria alternativet

Lägga till fler värden i string[]?

.NET

13 svar · 972 visningar · startad av inspiro

Medlem sedan sep. 2005673 inlägg
Frågan#1

Har en array som jag fyller så här:

String[] s = Str.Split(new Char[] {' '});

Så långt allt väl. Men hur gör jag för att efteråt lägga till ytterligare ett eller flera värden? Skulle vilja ha s.Add eller nåt men det finns ju inte...

Medlem sedan dec. 20014 239 inlägg
#2

Titta på Stringbuilder istället för array.

Medlem sedan mars 20007 896 inlägg
#3
s[s.Length()] = new String("Sista element");

Eller så skapar du helt enkelt en ArrayList av din array;

ArrayList al = ArrayList.Adapter(s);
al.Add(new String("Sista elementet"));
Medlem sedan jan. 20023 327 inlägg
#4
ArrayList al = ArrayList.Adapter(s);
al.Add(new String("Sista elementet"));

Ännu heller så här i så fall:

IList<string> list = new List<string>(s);
list.Add("en sträng");

Även StringBuilder som Zaiman tipsade om kan fungera bra, men det beror lite på vad det är du ska göra.

StringBuilder message = new StringBuilder();
message.Append("en sträng");
message.Append("en annan sträng");

Syftet med StringBuilder är att effektivisera sträng-kontaktinering. Dvs bygga ihop ett långt stringobjekt på ett effektiv sätt.

Medlem sedan sep. 2005673 inlägg
#5

Aha, tack! Jag gjorde en arraylist, fungerar bra! Varför är List<string> bättre och vad är det för något egentligen?

Stringbuilder, är det en array? Jag behöver ha direktåtkomst till varje element i listan.

Medlem sedan jan. 20022 440 inlägg
#6

Det är lättare att arbeta med object.value i en IList än i en array. Dessutom är IListen mer flexibel än en Array. Du kan givetvis ha en ArrayList som är ungefär samma sak som en IList men du har fortfarande lite svårare med dina objekt värden.

Medlem sedan sep. 2005673 inlägg
#7

Kan ni ge något exempel på vilket sätt det är lättare? Menar du om man sparar ned objekt i listan istället för rena värden så är det enklare att hantera objekten? Är IList en collection men inte en array (om jag fattat det rätt så är en array en lista med värden medan en collection är en lista med objekt)?

Vad betyder I framför IList (har sett att man ofta skriver ett I framför en del klasser)?

Medlem sedan jan. 20022 440 inlägg
#8

IEt står för Interface. Det är som en array fast du har både objektet och värdet i arrayen kan man säga. Du kan komma åt både objektet och värdet på lite olika sätt.

Rekommenderar /red. fel länk http://msdn2.microsoft.com/en-us/library/5y536ey6(VS.90).aspx om du vill läsa på lite.

Medlem sedan jan. 20023 327 inlägg
#9

inspiro skrev:

Aha, tack! Jag gjorde en arraylist, fungerar bra! Varför är List<string> bättre och vad är det för något egentligen?

List<T> (IList<T>) är en generic och motsvarar en ArrayList. Fördelarna med generics är många. En generic-lista är typsäker, dvs försöker du stoppa in andra objekt än vad du definerat T som (string i mitt exempel) så får du kompileringsfel. Med en vanlig ArrayList upptäcks sådana fel först vid runtime. Vidare så är det bättre prestanda med en generic-lista eftersom du inte behöver köra explicita\implicita "castningar" när läser från\skriver till din lista. Det tillhör god praktiskt att använda generiska samlingar istället för de gamla samlingarna i namespacet System.Collections.

Inte övertygad? Skaparen av C# förklarar det välidgt bra:
Anders Hejlsberg - What's so great about generics?

Medlem sedan sep. 2005673 inlägg
#10

Aha, ok tack, då förstår jag bättre! Några fler funderingar... eftersom IList är ett interface, måste man då inte implementera de metoder som ska finnas med i interfacet för att kunna använda IList? För om jag förstått det rätt så är ett interface en slags ram för vad som måste finnas med för att interfacet ska kunna användas?

Och varför skriver man så här:
IList<string> list = new List<string>(s);

...och inte så här:
IList<string> list = new IList<string>(s);

Vad är s?

Medlem sedan maj 20012 812 inlägg
#11

inspiro skrev:

eftersom IList är ett interface, måste man då inte implementera de metoder som ska finnas med i interfacet för att kunna använda IList? För om jag förstått det rätt så är ett interface en slags ram för vad som måste finnas med för att interfacet ska kunna användas?

Jo det stämmer, ett interface är ett "tom skal" som berättar hur skalet ser ut, men ingeting om vad som händer innan för skalet. Och skulle du skapa en egen Listklass som implementerade IList<> interfacet så skulle du behöva skiva allting själv, men det behöver du inte eftersom List<> är classen som implementerar IList<>.

inspiro skrev:

IList<string> list = new List<string>(s);

...och inte så här:
IList<string> list = new IList<string>(s);

Du kan inte skriva den understa raden eftersom du inte kan skapa instanser av interface, du måste skapa en instans av någon klass som har implementerat interfacet. Om du skulle lyckas med den understa raden, så skulle ingenting hända när du gör något med din list, eftersom ingen logik finns implementerad i IList<> bara vad metoderna skall heta, inte vad de gör.

inspiro skrev:

Vad är s?

Antagligen en Enumeration av något slag, typ en annan lista med strängar. Oftas så brukar man inte skicka med något till listor för när man börjar använda dem så brukar de vara tomma och då skriver man

IList<string> list = new List<>();
eller
List<string> list = new List<>();

- M

Medlem sedan jan. 20023 327 inlägg
#12

inspiro skrev:

Aha, ok tack, då förstår jag bättre! Några fler funderingar... eftersom IList är ett interface, måste man då inte implementera de metoder som ska finnas med i interfacet för att kunna använda IList? För om jag förstått det rätt så är ett interface en slags ram för vad som måste finnas med för att interfacet ska kunna användas?

Och varför skriver man så här:
IList<string> list = new List<string>(s);

...och inte så här:
IList<string> list = new IList<string>(s);

Vad är s?

Se Interface som ett kontrakt. IList är ett kontrakt som definierar vilka metoder som måste implementeras. IList innehåller ingen implementation utan bara metodsignaturerer etc. List är en klass som implementerar interface IList. Det vill säga, List innehåller implementationen av de metoder som defineras av interfacet IList.

inspiro skrev:

Aha, ok tack, då förstår jag bättre! Några fler funderingar... eftersom IList är ett interface, måste man då inte implementera de metoder som ska finnas med i interfacet för att kunna använda IList?

List är en implementation av IList som finns med i .NET-ramverket (System.Collections.Generic). Ibland kan man vilja ha en egen implementation av IList men List duger till det mesta.

inspiro skrev:

Och varför skriver man så här:
IList<string> list = new List<string>(s);

...och inte så här:
IList<string> list = new IList<string>(s);

Vad är s?

Du kan inte skriva "new IList()" eftersom IList är ett interface, dvs du kan inte skapa en instans av ett interface eftersom den inte innehåller någon implementation.

Båda dessa sätt fungerar däremot:

List<string> list = new List<string>(s);
IList<string> list = new List<string>(s);

Det är dock en viss skillnad mellan dessa två. Den första kan läsas som:
"Skapa ett nytt objekt av typen List"

medans den andra kan läsas som:
"Skapa ett nytt objekt av typen IList".

Skillnaden är den att om du skapar ett objekt av typen IList så kommer du bara åt de metoder som finns i interfacet IList. Säg att du gjort din egna klass som implementerat IList och även innehåller metoder som inte finns med i interface. Skriver du då såhär:

IList<string> list = new MyList<string>();

Så kommer du bara åt de metoder som finns i interfacet IList, detta fenomen brukar kallas "slicing", dvs allt som inte finns med i interfacet IList "klipps" bort. Gör du istället så här:

MyList<string> list = new MyList<string>();

Så kommer du åt allt som finns i din klass MyList. Är det möjligt så ska man dock försöka sträva efter att programmera mot ett interface.

inspiro skrev:

Vad är s?

s är din array som du postade i ditt första inlägg. Du behöver inte ha med det i konstruktorn. Det var bara ett exempel på hur du kan fylla din lista med värden vid initiering från en annan datastruktur som implementerar IEnumerabel.

/r Gladh var snabbare :)

Medlem sedan sep. 2005673 inlägg
#13

Toppenfin förklaring, nu vet jag mycket bättre. Tack för hjälpen! :bire

Medlem sedan sep. 2005673 inlägg
#14

Lånar den här tråden till en ny fråga på samma tema. Jag har 12 asp.image som jag skulle vilja lägga in i en array av något slag för att göra det enklare att jobba med dem. Vilken typ av array ska man använda för objekt och hur gör man?

265 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)