Laden...

Liste: Anzahl der Elemente eines bestimmten Typs ermitteln

Erstellt von cpa87 vor 10 Jahren Letzter Beitrag vor 10 Jahren 7.223 Views
Thema geschlossen
C
cpa87 Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren
Liste: Anzahl der Elemente eines bestimmten Typs ermitteln

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?

Hinweis von herbivore vor 10 Jahren

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.

771 Beiträge seit 2009
vor 10 Jahren

int countOfTestA = t.OfType<TestA>().Count();

C
cpa87 Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren

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

C
258 Beiträge seit 2011
vor 10 Jahren

Aber ich bekomme es nicht hin, die Elemente nach ihren Typen zu untersuchen.

Nur der Vollständigkeit halber, der Operator den du suchst: is (c#)

t.Count(predicate => predicate is TestA)

OfType funktioniert natürlich auch.

C
cpa87 Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren

Super, vielen vielen Dank Console32!!!

771 Beiträge seit 2009
vor 10 Jahren

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)

C
cpa87 Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren

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!

D
216 Beiträge seit 2009
vor 10 Jahren

Nur der Vollständigkeit halber, der Operator den du suchst:
>

Und [Hinweis] Wie poste ich richtig? 1.1, 1.1.1, 1.2

C
cpa87 Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren

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.

C
2.122 Beiträge seit 2010
vor 10 Jahren

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.

C
cpa87 Themenstarter:in
34 Beiträge seit 2013
vor 10 Jahren

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 😃

5.942 Beiträge seit 2005
vor 10 Jahren

Hallo

Mit dem typeof()-Operator wärst du mit deinem Ansatz auch ans Ziel gelangt.

Gruss Peter

Hinweis von herbivore vor 10 Jahren

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

S
269 Beiträge seit 2010
vor 10 Jahren

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

Hinweis von herbivore vor 10 Jahren

Die Eingangsfrage kann gerade noch durchgehen, aber spätestens die Nachfragen fallen unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Thema geschlossen