Laden...

Arrays initialisieren ohne zu wissen wie viele var darin gespeichert werden

Erstellt von BummzuaBua vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.315 Views
Thema geschlossen
B
BummzuaBua Themenstarter:in
3 Beiträge seit 2019
vor 5 Jahren
Arrays initialisieren ohne zu wissen wie viele var darin gespeichert werden

Haiho

Kurz und pregnant, ich versuche eine Reihe von vordefinierten Zahlen in einem Array,

int[] arZahlen = new int[] {44, 33, 22, 11, 13, 15, 99, 2012, 456, 77, 86, 54, 31, 48 };

in 2 seperaten Arrays abzuspeichern.
Der eine enthält gerade, der andere ungerade zahlen.

int[] arGerade = new int[14];
int[] arUngerade = new int[14];
int gerade = 2;
bool teilbar = false;

for (int i = 0; i < arZahlen.Length-1; i++)
                        {
                                teilbar = (0 == (arZahlen[i] % gerade)); //bool =teilbar durch 2 Ja oder Nein
                                if (teilbar == true)
                                {
                                        arGerade[i] = arZahlen[i]; 
                                                                               
                                }
                                else arUngerade[i] = arZahlen[i];
                        }

Hab meinen anfängerKopf schon zerbrochen aber komme nicht dahinter wie ich es löse.

arGerade gibt mir: 44,0,22,0,0,0,0,2012,456,0,86,54,0,0 aus.

Wie kann ich dem Array sagen das ich nicht weiß wie viele var darin letztendlich zu speichern sind?
Und wie kann ich mein Gerumpel etwas Fachmännischer angehen.
Da ich noch in Kinderschuhen herumlaufe, bitte halbwegs leicht verständlich ausdrücken. 😃

Freundliche Grüße
Bummi

4.931 Beiträge seit 2008
vor 5 Jahren

Benutze statt einem Array (mit fester Anzahl) eine dynamische List<T>, so daß du per list.Add(x) beliebig viele Einträge hinzufügen kannst (ohne die Gesamtanzahl im voraus wissen zu müssen).

B
BummzuaBua Themenstarter:in
3 Beiträge seit 2019
vor 5 Jahren

Benutze statt einem Array (mit fester Anzahl) eine dynamische
>
, so daß du per list.Add(x) beliebig viele Einträge hinzufügen kannst (ohne die Gesamtanzahl im voraus wissen zu müssen).

Danke vielmals.
Zwar auch mit etwas Kopfzerbrechen, aber es hat einwandfrei funktioniert.

Hätte man das auch irgendwie mit einem Array lösen können, oder ist es generell nur mit List möglich?

2.078 Beiträge seit 2012
vor 5 Jahren

Die List nutzt intern auch nur ein Array.
Also ja, geht auch ohne List, allerdings baust Du dann das Gleiche wie die List nach und das wahrscheinlich nicht Mal halb so gut, wie die List in .NET

Oder Du nutzt IEnumerable bzw. das yield-Schlüsselwort, aber das funktioniert völlig anders und ist wahrscheinlich nicht unbedingt das Beste für einen Anfänger.

B
BummzuaBua Themenstarter:in
3 Beiträge seit 2019
vor 5 Jahren

Oder Du nutzt IEnumerable bzw. das
>
-Schlüsselwort, aber das funktioniert völlig anders und ist wahrscheinlich nicht unbedingt das Beste für einen Anfänger.

Dann bedanke ich mich ebenfalls recht herzlich für die Antwort.
Werd mich auch da mal ein bisschen reinlesen und versuchen aufzusaugen was ich aufsaugen kann.
thanks 😃

2.078 Beiträge seit 2012
vor 5 Jahren

Ah - ich seh gerade, dein Vorhaben ist per yield nicht so einfach möglich, zumindest nicht exakt so.

Beispiel:

public IEnumerable<int> GetNumbers()
{
    for (var i = 0; i < 10; i++)
        yield return i;
}

public void UseNumbers()
{
    foreach (var number in GetNumbers())
        Console.WriteLine(number);
}

Das geht, zwei Listen zurück geben geht aber nicht.
Du bräuchtest dann ein anderes Verfahren.

Das Wichtigste ist die Liste, die brauchst Du immer und immer wieder.

3.003 Beiträge seit 2006
vor 5 Jahren

Die Herangehensweise per yield verführt dazu, wenn man mehrere Ergebnislisten haben will, pro Ergebnisliste die Quell-Collection einmal zu durchlaufen, und sich damit die schönere Syntax mit schlechterer Performance zu erkaufen. (Ich meine: wenn man von dem Punkt, den Palladin007 gepostet hast, weiter macht bis zu einem Punkt, wo man n Ergebnislisten hat).

Von daher: bleib bei den Listen, dein geposteter Quellcode war völlig in Ordnung, wenn auch mit dem falschen Collection-Typ (Array).

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

6.911 Beiträge seit 2009
vor 5 Jahren

Hallo BummzuaBua,

BTW [Tipp] Anfängerhinweis == true / == false, somit reicht


if (teilbar)

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
368 Beiträge seit 2006
vor 5 Jahren

Und noch ein kleiner Randhinweis von wg. dynamischer Arraygrösse: die ganz alte Methode ging über ArrayList, eine neuere Option ab .NET 3.5 ist die Array.Resize()-Methode.
Siehe auch SO - how-to-extend-arrays-in-c-sharp und DotnetPerls - ArrayResize

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

T
2.219 Beiträge seit 2008
vor 5 Jahren

@M.L.
Das liegst du etwas falsch.
Aber ab .NET 2.0 gab es schon die List<T> die, wie Th69 schon schrieb, intern mit einem Array arbeitet und dieses dann auch bei erreichen der Array Kapazität mit Array.Resize erweitert.
Ist also nciht erst seit .NET 3.5 möglich mit Array.Resize direkt oder durch List<T> indirekt zu arbeiten.

Array.Resize muss man i.d.R. eigentlich nicht verwenden.
Die meistens kann man direkt mit List<T> als Container arbeiten und muss sich um solche grundsätzlichen Themen keine Gedanken machen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

3.003 Beiträge seit 2006
vor 5 Jahren

Das ist falsch.

List<T> benutzt an keiner Stelle Array.Resize. Die Quellen sind offen, es schadet nicht, sie zu prüfen, bevor man eine Behauptung aufstellt.

As elements are added to a List, the capacity of the List is automatically increased as required by reallocating the internal array.

(Hervorhebung von mir)

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
2.219 Beiträge seit 2008
vor 5 Jahren

@LaTino
Stimmt hatte ich mit Array.Copy verwechselt.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

5.657 Beiträge seit 2006
vor 5 Jahren

Leute, diese Diskussion führt doch zu nichts. Ob man das jetzt Resizing oder Reallocation nennt, es läuft doch auf das Gleiche raus. Und es hilft niemandem weiter, wie sind hier im Grundlagenforum! Also bitte nehmt euch mal zusammen, und laßt nicht jede einfache Frage zu einem Endlosthema ausarten!

Weeks of programming can save you hours of planning

3.003 Beiträge seit 2006
vor 5 Jahren

@MrSparkle, ah, okay. Mir war entgangen, dass im Grundlagenforum keine Grundlagen mehr diskutiert werden sollen. Entschuldigung.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

Thema geschlossen