mehrere Indizes in einer Liste finden

knappenboy

Mitglied
Hallo,

gibt es eine Methode, wie man mehrere Indizes in einer Liste finden kann?

Beispiel:

List<string> Liste = new List<string>();


public Form1()
{
InitializeComponent();
Liste.Add("1"); bitte.Add("0"); bitte.Add("1"); bitte.Add("3");
}

Ich möchte nun, dass das Programm mir die Indizes von der List Liste ausgibt, wo der Wert 1 drin steht. Also Index[0] und Index[2].

Mit

Liste.IndexOf()

klappt nur ein Element zu finden.
Bitte um Hilfe
 

knappenboy

Mitglied
Könntest du bitte, kurz meine Werte eintippen und ein wenig erklären?

damit ich ... Index[0] und Index[2] z.B. in einer Textbox sehe.
 

Cromon

Erfahrenes Mitglied
Wie sheel sagte kannst du einen zweiten Parameter an IndexOf geben, der sagt ab wo in der Liste gesucht werden soll. Du suchst also in deinem Beispiel alle Indices von 1. Also rufst du im ersten Durchgang IndexOf ab der Position 0 (dem Start) auf und bekommst den ersten Index von 1 in der Liste. Wenn nicht vorhanden, dann ist i == -1. Ansonsten machst du mit dem Index was du willst (ausgeben, speichern, w/e). Anschliessend rufst du IndexOf auf um wieder nach 1 zu suchen. Dieses mal allerdings soll es erst aber der Position i + 1 (man erinnere sich, i war das letzte Vorkommen von 1) suchen. Damit erhälst du den zweiten Index von 1 in der Liste. Das geht so lange weiter bis kein Vorkommen von 1 mehr gefunden wurde.
 

knappenboy

Mitglied
Danke für deine Antwort. Funktioniert das auch bei dynamischen Listen (hoffentlich ist der Begriff richtig)? Also, wenn ich eine Liste unterschiedlich füttere und ich nicht weiß wie groß diese wird, bzw. immer unterschiedlich ist.
 

Spyke

Premium-User
schau dir mal FindAll von List<T> an
https://msdn.microsoft.com/de-de/library/fh1w7y8z(v=vs.110).aspx
diese Methode würde dir direkt alel Treffer liefern.

Im Grunde übergibst du eine Methode an FindAll die bestimmt wann ein Element gültig ist um zurückgegeben zu werden.
Code:
Liste.FindAll(meineSuche);
....
private bool meineSuche(string item)
{
   return item == "1";
}

als anonyme Methode
Code:
Liste.FindAll(delegate(string item)
{
   return item == "1";
});

verkürzt als lambda Ausdruck
Code:
Liste.FindAll((x)=> x == "1");

Beachtung muss man eigentlich nur den Parameter der Funktion FindAll:
https://msdn.microsoft.com/de-de/library/bfcke1bz(v=vs.110).aspx
Ein delegate ist im Grunde eine Beschreibung wie deine Methode aussehen muss damit du sie weiter reichen kannst.
 

knappenboy

Mitglied
Hallo,
es hat wunderbar geklappt, nochmals vielen Dank. Nun habe ich ein weiteres Problem. Ich habe aus einer Liste (Timer_unbearbeitet) mir Elemente raus geholt, anhand der Indizes in eine neue Liste gespeichert.
Code:
 List<double> x0, x1, x2, x3, x4 = new List<double>();  List<double> Index_benoetigt = new List<double>();

x0 = Timer_unbearbeitet.GetRange(Convert.ToInt32(Index_benoetigt[0]), 31);
x1 = Timer_unbearbeitet.GetRange(Convert.ToInt32(Index_benoetigt[1]), 31);
x2 = Timer_unbearbeitet.GetRange(Convert.ToInt32(Index_benoetigt[2]), 31);
x3 = Timer_unbearbeitet.GetRange(Convert.ToInt32(Index_benoetigt[3]), 31);
x4 = Timer_unbearbeitet.GetRange(Convert.ToInt32(Index_benoetigt[4]), 31);

Nun möchte die Listen zusammenfassen.
Code:
Timer = x0.Concat(x1).Concat(x2).Concat(x3).Concat(x4).ToList();

Das klappt auch alles. Ist nur für mich nicht effizient. Am liebsten möchte ich es in einer Schleife knapp in einem Schritt zusammenfassen. Ungefähr so:
Code:
 for (int c = 1; c < 4; c++)
                {
                    Timer = Timer_unbearbeitet.GetRange(Convert.ToInt32(Index_benoetigt[0]), 31).Concat(Timer_unbearbeitet.GetRange(Convert.ToInt32(Index_benoetigt[ c]), 31)).ToList();
                }

Das Problem ist, dass nur die Letzten Elemente mit angefügt werden, sprich x0 und x4. Ich wöllte aber gern, dass es x0 bis x4 in einer Liste angefügt werden.

Hoffentlich hat noch Jemand eine Idee. Falls es nicht möglich ist, aus welchem Grund auch immer, dann würde ich es auch gern wissen.