Laden...

Element einer Liste durch ein Attribut auswählen

Erstellt von KingPin vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.217 Views
K
KingPin Themenstarter:in
376 Beiträge seit 2005
vor 14 Jahren
Element einer Liste durch ein Attribut auswählen

einen schönen guten tag wünsche ich!

ich hab eine frage an euch:
ist es möglich ein objekt aus einer liste durch ein angehängtes attribut auszuwählen?

man kann ja elemente in einer liste durch ElementAt(index) auswählen..
ist dies in ähnlicher form durch die angabe eines attributes möglich?

z.b. element der liste, bei dem das attribut "kunde" ist..

danke.

1.985 Beiträge seit 2004
vor 14 Jahren

Hallo KingPin,

wenn Du eine normale Liste benutzt, dann nein. Da hilft nur suchen und vergleichen.

Wenn es schneller sein soll und der Zugriff durch ein bestimmtes Attribut sehr häufig benutzt wird, kannst Du die Elemente beispielsweise zusätzlich in einem Dictionary speichern und als Key das Attribut benutzen (wenn die Attribute eindeutig sind). Dann hast Du (wahlfreien) Zugriff über das Attribut.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo KingPin,

Attribute (oder meinst du Properties?) hängen doch gar nicht an Objekten, sondern an Klassen bzw. deren Membern.

herbivore

K
KingPin Themenstarter:in
376 Beiträge seit 2005
vor 14 Jahren

ja das meine ich.. vielleicht hab ích mich nur unglücklich ausgedrückt.

was ich will:
ich hab eine liste vom typ object.
in dieser sind unterschiedliche instanzen von unterschiedlichen klassen drin.
diese haben auch unterschiedliche attribute.

nun soll es ja so funktionieren, dass ich durch die angabe des attributes auf das element in der liste zugreifen kann.

auf die normale liste bin ich gar nich so festgeschossen...

suche eher nach dem how to...

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo KingPin,

wenn du Properties meinst, solltest du auch Properties schreiben. 😃 Attribute in in C# was anderes. Wenn du nicht den in einem bestimmten Kontext richtigen Namen verwendest, führt das zu Verwirrungen. Im Kontext von C# gilt: Attribute != Properties.

ich hab eine liste vom typ object.
in dieser sind unterschiedliche instanzen von unterschiedlichen klassen drin.

Das ist schonmal schlecht. Warum ist das so? Um was für Objekte geht es? Was haben diese gemeinsam? Und worin unterscheiden sie sich?

herbivore

K
KingPin Themenstarter:in
376 Beiträge seit 2005
vor 14 Jahren

es handelt sich in der liste um aufträge. diese gehören zu unterschiedlichen klassen.

manche aufträge haben gemeinsamkeiten, die über attribute gekennzeichnet sind.
manche haben aber auch keine gemeinsamkeiten, was auch durch die attribute markiert wird.

wenn ich nun in der liste angenommen 10 aufträge habe, wollte ich eben durch die angabe des attributes den auftrag auswählen, der z.b. mit den anderen nichts gemeinsam hat und ihn dann bearbeiten...an welcher stelle er in der liste steht ist nicht bekannt und immer anders. iterieren wollte ich an sich nicht...
ich hatte mir das so vorgestellt, dass ich einfach sage gib mir das element, welches das attribut "spezialauftrag" hat...
daher der versuch....

ist der gedankengang an sich umsetzbar, oder eher nicht zu gebrauchen?

S
469 Beiträge seit 2007
vor 14 Jahren

Hmm, so richtig verstanden hab ich's nicht, was du mit Attribut meinst.
Hat das Objekt dann ein Feld/Property namens "Spezialauftrag", das dann true oder false sein kann? Oder hast du ein Feld/Property "Auftragstyp" vom Typ string, in dem dann "Spezialauftrag" drin steht? Oder gibt es Klassen, die haben ein Property "Spezialauftrag", und andere nicht? Mir klingt es spontan nach dem letzten Fall...
Wenn es alles Aufträge sind, dann wunderts mich allerdings, warum es keine gemeinsame Basisklasse oder zumindest ein Interface gibt.

Ich hätte jetzt spontan gedacht dass es da eine Lösung mit LINQ geben könnte (evtl. mehrstufig), vielleit mit Liste.Find(t->hier prüfen ob Typ von t ein Property namens Spezialauftrag hat)
Abe ich kenne mich mit LINQ nicht genug aus und da sonst noch niemand was dazu geschrieben hat, scheint es wohl nicht zu gehen.

gruß
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo KingPin,

Hmm, so richtig verstanden hab ich's nicht, was du mit Attribut meinst.

mir geht es eben so. Bitte verwende die richtigen Begriffe im richtigem Kontext bzw. die im Kontext von C# richtigen Begriffe.

ist der gedankengang an sich umsetzbar, oder eher nicht zu gebrauchen?

Zumindest scheint mir da noch einiges sprachlich und gedanklich durcheinander zu gehen.

es handelt sich in der liste um aufträge.

Dann solltest du auch eine List<Auftrag> verwenden.

manche aufträge haben gemeinsamkeiten

Das klingt für mich danach, als hätten die Aufträge dann (sinnvollerweise) die gleiche Unterklasse. Wenn es mit Unterklasse nicht abzubilden geht, dann vielleicht im Interfaces.

Die Ermittlung, um was für einen Auftrag es sich handelt, kann das mit is erfolgen.

herbivore

K
KingPin Themenstarter:in
376 Beiträge seit 2005
vor 14 Jahren

nun ja.. mit der property würde das nich gehen...
es gibt ja noch viele andere auftragsarten.
diese sollen nicht unbedingt in der klasse auftauchen.

der ansatz mit linq klingt aber interessant....
ich probier mich daran mal aus...

für weiteres wäre ich auch noch offen;)

Gelöschter Account
vor 14 Jahren

du musst doch zumindest eine basisklasse für alle aufträge haben? oder unterscheidest du aufträge rein nach ihren attributen? wenn ja, ist dir bewusst das du zwangsläufig reflection verwenden musst um damit vernünftig arbeiten zu können und das reflection spürbaren impact auf performance und stabilität hat?

K
KingPin Themenstarter:in
376 Beiträge seit 2005
vor 14 Jahren

ich weiss dass sich reflection negativ auf die geschwindigkeit auswirkt.
es würde nur in einem unterpunkt anwendung finden, was sich somit verschmerzen ließe.

es gibt keine basisklasse, weil es bei mir in diesem falle einfach keinen sinn machen würde, auch wenn es auf der hand liegt, dass aufträge eine basisklasse haben sollten. daher will ich attribute verwenden!

Gelöschter Account
vor 14 Jahren

es gibt keine basisklasse, weil es bei mir in diesem falle einfach keinen sinn machen würde, auch wenn es auf der hand liegt, dass aufträge eine basisklasse haben sollten.

paradox. auch wenn in der basisklasse nur ein property "Auftragsart" ist, hast du schon gewonnen.... aber gut.

du hast also eine liste und willst alle items mit einem bestimmten attribut haben und das ohne ein foreach manuell zu benutzen. dann nimm extensionmethods.

das ist im prinzip nur ein einzeiler...

S
469 Beiträge seit 2007
vor 14 Jahren

Hmm, vielleicht kannst du mal etwas Quellcode posten, was du mit Attribut nun tatsächlich meinst? Ich habs leider immer noch nicht kapiert. Also ein Property scheint es nicht zu sein.
Dass es wirklich garkeine Gemeinsamkeiten gibt finde ich seltsam, hätte erwartet, dass jeder Auftrag zumindest sowas wie eine Auftragsnummer hat, eigentlich auch einen Auftraggeber und ein Datum oder sowas.
Wenn es denn nun Gemeinsamkeiten gibt zwischen unterschiedlichen Aufträgen, auch wenn es keine Basisklasse gibt, dann wären die gleichen Eigenschaften vielleicht Kandidaten für ein Interface? Dann kannst du nämlich einfach prüfen ob eine Klasse vom Typ I... ist.

gruß
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

K
KingPin Themenstarter:in
376 Beiträge seit 2005
vor 14 Jahren

hab das jetzt mit extensionmethods gelöst.

hier der quelltext..

     public static object GetObjectByInstanceAttribute(this List<object> objekte, string InstanceName)
        {
            foreach (object o in objekte)
            {
                if (o.GetType().GetCustomAttributes(typeof(RptClasses.InstanceAttribut), false).Count() > 0)
                    if (InstanceName == ((RptClasses.InstanceAttribut)o.GetType().GetCustomAttributes(typeof(RptClasses.InstanceAttribut), false)[0]).InstanceName)
                        return o;              
            }
            return null;
        }

es funktioniert so wie ich das wollte... ist zwar auf einen attributtyp festgenagelt, aber reicht fürs erste...

eure meinung dazu?

Gelöschter Account
vor 14 Jahren

ist zwar auf einen attributtyp festgenagelt,

dann mach die methode generisch und lass den verwender den attributtyp mitgeben.

K
KingPin Themenstarter:in
376 Beiträge seit 2005
vor 14 Jahren

mhh

wie würde das dann aussehen?

bin jetzt etwas überfragt...

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo KingPin,

du meintest also wirklich Attribute im C# Sinne.

Also ich finde diese Herangehensweise mehr als merkwürdig. Attribute musst du ja fest zu Compile-Zeit angeben. Dann kannst du genauso gut Interfaces verwenden. Was dann den Vorteil hat, dass du auf die Member ohne Reflection zugreifen kannst.

herbivore