class TestClass { public int id; public TestClass(int id) { this.id = id; } } namespace Blaa { class Program { public static List<TestClass> tests = new List<TestClass>(); static void Main(string[] args) { tests.Add(new TestClass(1)); tests.Add(new TestClass(2)); tests.Add(new TestClass(3)); foreach (TestClass t in tests) { if (t.id == 2) tests.Remove(t); } Console.Read(); } } }
Eli millä kikalla onnistuisi poistamaan listasta alkion loopissa, ylläoleva kun rysäyttää ohjelman?
Voit käyttää tavallista for-silmukkaa.
for (int i = 0; i < tests.Count;) { if (tests[i].id == 2) { tests.RemoveAt(i); } else { ++i; } }
Takaperin koodista tulee yksinkertaisempi.
for (int i = tests.Count - 1; i >= 0; --i) { if (tests[i].id == 2) { tests.RemoveAt(i); } }
Lyhyempi vaihtoehto on LINQ.
tests.RemoveAll(t => t.id == 2);
Tuossa vähän selostusta vanhasta topicista, kielenä kylläkin vb.net mutta idea selviää: https://www.ohjelmointiputka.net/keskustelu/
Ei koodissasikaan kyllä varsinaista vikaa ole, jos olet includannut Genericsit mukaan. (tuo list<T> ei ole vakiona includattuna. Voit käyttää myös System.Collections.Generic.List<T>)
groovyb kirjoitti:
Ei koodissasikaan kyllä varsinaista vikaa ole,
Onpa. Listaa ei voi muokata kesken foreach-silmukan.
Mikäköhän lukihäiriö on iskenyt tuota koodia katsellessa.
tämä foreach toimii:
tests.ForEach(delegate(TestClass t) { if(t.id == 2) tests.Remove(t); });
Aihe on jo aika vanha, joten et voi enää vastata siihen.