Hallo Zusammen,
ich stehe mal wieder auf dem Schlauch.
Ich habe folgendes Problem:
Ich habe eine Basisklasse "Test". Aus dieser Klasse leite ich jetzt verschiedene Tochterklassen ab -> "TestA", "TestB", "TestC",..
Jetzt habe ich eine Liste erstellt, die beliebig gefüllt sein kann:
List<Test> t = new List<Test>();
t.Add(new TestA());
t.Add(new TestA());
t.Add(new TestC());
t.Add(new TestB());
t.Add(new TestB());
t.Add(new TestC());
t.Add(new TestC());
t.Add(new TestA());
Ich möchte jetzt wissen, wie viele Elemente in der Liste vom Typ "TestA" sind. Ich weiß wie ich die Anzahl der Elemente finde, die eine bestimmte Eigenschaft besitzen. Aber ich bekomme es nicht hin, die Elemente nach ihren Typen zu untersuchen.
Noch eine allgemeine Frage zum Thema Listen. Ich habe gelernt, dass eine List der ArrayList vorzuziehen ist. Jedoch erschließt sich mir noch nicht ganz der Vorteil oder der ausschlaggebende Punkt, warum die List vorzuziehen ist?
Der konkrete Grund (insbesondere die Typunsicherheit) spielt eigentlich keine Rolle. ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.
Oh man, es war zu einfach. Ich habe lange umständlich versucht es irgendwie mit t.Count(...) und einem Vergleich der Typen als Bedingung in der Klammer zu machen. Aber das es auch so rum geht, da wäre ich nie drauf gekommen.
Vielen Dank!!! Super Forum...
VG
Stimmt, so geht es natürlich auch.
Aber ich würde die Variable nicht "predicate" nennen, denn dies wäre ja der gesamte Ausdruck, sondern z.B.
t.Count(test => test is TestA)
Noch eine kleine, wahrscheinlich genauso einfache, Frage:
Ich möchte jetzt eine if-Abfrage machen und als Bedingung wieder den Elementtyp vergleichen.
if( t[index].GetType() == ... )
oder
if( t[index].Equals(new TestA())
Die erste Lösung funktioniert nicht, weil ich nicht weiß wie ich die Typen dann vergleichen soll und die zweite finde ich nicht sonderlich elegant.
Übersehe ich hier auch wieder eine sehr einfache, noch dazu elegante Lösung?
Vielen Dank!
Nur der Vollständigkeit halber, der Operator den du suchst:
>
Und [Hinweis] Wie poste ich richtig? 1.1, 1.1.1, 1.2
Ok, das es wieder so einfach geht, dass wusste ich nicht. ICh wusste nicht, dass man den Operator "is" auch an der Stelle nutzen kann.
Ich habe es jetzt so gelöst:
t.ElementAt(index) is TestA
Vielen Dank noch mal an alle.
f( t[index].GetType() == ... )
Gerade hast du dich doch über "is" gefreut, das wäre genau richtig.
if( t[index].Equals(new TestA())
Das kann nicht funktionieren denn ein Objekt ist nicht gleich einem anderen Objekt.
Ja, die Lösung lag direkt vor meinen Augen. Ich habe vorher so gut wie nie mit is gearbeitet. Aber jetzt wird der Operator fester Bestandteil meiner Gedanken beim programmieren 😃
Hallo
Mit dem typeof()-Operator wärst du mit deinem Ansatz auch ans Ziel gelangt.
Gruss Peter
Aus objektorientierter Sicht ist üblicherweise der Vergleich obj is MyType
dem Vergleich obj.GetType == typeof (MyType)
vorzuziehen. Einen Unterschied macht es dann, wenn obj ein Objekt einer Unterklasse von MyType enthält.
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
if( t[index].Equals(new TestA())
Das kann nicht funktionieren denn ein Objekt ist nicht gleich einem anderen Objekt. Das könnte unter Umständen schon funktionieren, wenn er seine Objekte IEquatable implementieren lässt und die Equals-Methode überschreibt...
Diese Vorgehensweise ist zwar für diesen Zweck unter keinen Umständen anzuraten, würde jedoch auch zum Ziel führen...
Die Eingangsfrage kann gerade noch durchgehen, aber spätestens die Nachfragen fallen unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1.