C# List<class> nach bestimmter Eigenschaft und Wert durchsuchen

Thaxll'ssillyia

Captain
Registriert
Dez. 2007
Beiträge
3.530
Hallo Community!

Ich steh vor einem Problem bei meinem aktuellen projekt, ich versuch es mal an einem Beispiel zu verdeutlichen:

Ich habe diese Klasse:

Code:
class Computer
{
    public int AnzahlKerne;
    public string Graka;
    public int Ram_Größe;
    public string Seriennummer;
    public int NetzteilLeistung;
}

Nun hab ich eine Liste List<Computer> Rechner, die eben unterschiedliche Rechner speichert.

Nun brauch ich eine Prozedur, die mir den Computer zurückgibt, dessen bestimmte Eigenschaft einen bestimmten Wert aufweist, also so ungefähr:

Code:
public static Computer SpecSearch([Eigenschaft des Computers], object Wert)
{
     //...
     return //Treffer;
}

, sodass ich dann zb Aufrufen kann:

Code:
Computer C = SpecSearch(Computer.AnzahlKerne, 4);

Wie kann man das umsetzen? Irgendwas mit enumeration?

Vielen Dank für Hilfe!

Gruß Thax
 
Du kannst mit Link durchsuchen....

Code:
List<Computer> cmp = new List<Computer>();

///Deine Einträge hinzufügen.... bla bla

...
...


Computer[] comp = cmp.Where(pc=>pc.AnzahlKerne == 4);

Muss aber warnen... da Linq normalerweise Langsamer ist als die Iteration ist es eigentlich deine Sache, was du anwenden willst. Du kannst genau so gut mit foreach Arbeiten.
 
Ne mit FirstOrDefault würde ich das ganze nicht benutzen. Es ist besser wenn man null als ergebniss zurückbekommt anstatt eine Leere Instanz. Erspart man sich auf jeden Fall viel Debuggen wenn was nicht richtig sein sollte.
 
@roker: Du kriegst bei FirstOrDefault Null zurück ;)

Zu deiner Frage Thaxll'ssillyia:
Übergib der Methode doch einen Delegate der genau deine Ansprüche erfordert.
 
Zuletzt bearbeitet:
@toeffi Wirklich... ich dachte Default wäre dann die Instanzierung der Klasse... hmm bin jetzt kein Linq experte... benutze das aber ab und zu wenn es keine Performance abgefragt ist... Linq ist auf jeden Fall langsamer als ein Normaler Iterator.

Ich glaube das mit Linq ist für Thaxll zu hoch. Versucht mal mit schleifen... der Prinzip ist der gleicher.

Code:
///Natürlich zuerst initalisieren.
List<Computer> cmpList;

private Computer GetPC()
{
    foreach(Computer c in cmpList)
    {
        if(c.AnzahlKerne == 4)
            return c;
    }
}
 
///Natürlich zuerst initalisieren.
List<Computer> cmpList;

private Computer GetPC()
{
foreach(Computer c in cmpList)
{
if(c.AnzahlKerne == 4)
return c;
}
}

Erfüllt meine Anforderung nach freier Wahl der Eigenschaft aber nicht.
 
@Thaxll'ssillyia: Das ist korrekt.
Wenn du jedoch eine Variante willst die supergenerisch ist und du freie Wahl haben willst, muss man da sicherlich noch etwas Aufwand reinstecken.
 
Geht das überhaupt?
Würde mich auch mal interessieren.

Ich hätte einfach ´ne enum mit den Sucheigenschaften erstellt und dementsprechend geparst am Anfang der Methode.
 
Also so ohne weiteres geht das nicht.
Aber die einfachste Möglichkeit ist halt das man eben nicht versucht das soweit wie möglich zu verallgemeinern sondern für den speziellen Fall die Linq-Abfrage abschießt und fertig.
 
Thaxll'ssillyia schrieb:
Erfüllt meine Anforderung nach freier Wahl der Eigenschaft aber nicht.

Das war nur ein Beispiel... wir lösen deine Problem nicht, wir helfen lediglich. Die Lösung musst du halt selbst hinkriegen. Ansonsten verlange ich pro Stunde 30€ (natürlich Netto) ;)
 
Naja, du schreibst hier, wir helfen dir, aber lösen musst du es selber, wobei noch nichtmal geklärt ist, ob mein Vorhaben überhaupt möglich ist.
Find ich ehrlich gesagt unverschämt.
 
Nein mit Unverschämtheit hat das nichts zu tuen.
Wir haben dir Tips gegeben wie du dein Problem lösen kannst, umsetzen musst du das nur alleine, sonst ist der Lerneffekt auf deiner Seite ja gleich Null.
Du kannst dir ja nicht immer von anderen deine PRobleme lösen lassen ;)

Und wie ich schon sagt, es wäre günstiger das nicht zu verallgemeineren weil das in viel mehr arbeit ausartet.
 
LOL was ist unverschämt... dass du dein Gehirn nicht benutzen willst?
Wenn du weiter so machst endest du auf der Straße, weil du selbst ohne die anderen nichts machen kannst.

Du kannst sicher Fragen... aber das Denken, was für die am besten ist, überlassen wir ja dir!


Das mit 30€ die Stunde war kein Witz... ich habe meine eigene Firma und kann dir die Rechnung ausstellen, wenn du wirklich irgendwas programmiert bekommen willst. Stell einfach die Anforderungen deines Programms und ich bastele dir das.

Hier geht es hauptsächlich darum fragen zu beantworten und nicht um die Resultate deine "Hausarbeit" (ich beziehe hier nicht auf die Schule sondern auf dein Projekt) zu Erstellen.

Wie gesagt: die Entscheidung, welchen weg du nimmst liegt bei dir!
 
Es gibt Eigenschaften (Property) und es gibt Felder (Field). Was du in deine Klasse hast, nennt man Felder. Bei den Eigenschaften, bastelt dir der Compiler intern Getter und Setter, was äquivalent zu den Methoden ist. Ist halt nur so, dass du eine Methode dir im Code ersparst...

Für mich ist immer noch nicht klar was genau du suchst. Du kannst auch genau so gut eine List<Computer> zurückgeben wo alle PC mit den "4" CPU-Kernen sind. Du kannst alles mögliche in der IF abfrage einbauen oder meinetwegen mit Linq. Es ist halt die Frage was genau nach der Suche erfolgt....
 
ich will zb die Methode so

Code:
Computer C = SpecSearch(Computer.AnzahlKerne, 4);

als auch so

Code:
Computer C = SpecSearch(Computer.Ram_Größe, 2048);

oder so

Code:
Computer C = SpecSearch(Computer.Seriennummer, "37rgeug43");

aufrufen können, also Feld oder Wert selbst definieren können.
 
Zurück
Oben