Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: List.Remove silmukassa

Jonne [10.06.2013 19:12:05]

#

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?

Metabolix [10.06.2013 19:17:00]

#

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);

groovyb [10.06.2013 19:19:13]

#

Tuossa vähän selostusta vanhasta topicista, kielenä kylläkin vb.net mutta idea selviää: https://www.ohjelmointiputka.net/keskustelu/21579-vb-net-usercontrolin-controllit/sivu-1

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>)

Metabolix [11.06.2013 17:25:30]

#

groovyb kirjoitti:

Ei koodissasikaan kyllä varsinaista vikaa ole,

Onpa. Listaa ei voi muokata kesken foreach-silmukan.

groovyb [11.06.2013 20:47:03]

#

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);
});

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta