List.Exists-Methode

tecla

Erfahrenes Mitglied
Hallo zusammen
Ich habe eine Klasse Partner und lese aus meiner Datenbank Listen von solchen Partnern heraus. Jetzt möchte ich die Partner der eine Liste in eine andere Liste einfügen, sofern dieser Partner nicht schon drin ist.
Code:
foreach (Partner personenPartner in PersonenPartnerListe)
                    {
                        if(PartnerListe.Exists(PartnerVorhanden))
                        {}
                        else
                        {
                            PartnerListe.Add(personenPartner);
                        }
                    }
Nun müsste ich ja die Predicat-Methode "PartnerVorhanden" schreiben, die kontrolliert, ob ein Partner schon in der Liste ist oder nicht. Dazu würde ich gern die IDs der partner vergleichen. In Pseudo-Code irgend sowas:
Code:
private bool PartnerVorhanden(Partner partner)
        {
            if (personenPartner.IDPartner == Partner.IDPartner)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
Ich verstehe einfach nicht, welcher Partner als Parameter reinkommt und falls es eben alle Partner der PersonenPartnerListe wären, wie ich diesen dann mit einer einzelnen Eigenschaft der Partner aus der PartnerListe vergleichen kann.
In der Microsoft-Hilfe finde ich nur ein Beispiel mit einer string-Liste, die völlig simpel ist, da nicht nur eine Klasseneigenschaft verglichen wird, sondern eben der ganze string.

Falls jemand also ein Tuorial findet für die List.Exists-Methode(), oder mir erklären kann kann, wie diese ganeu funktioniert, wäre ich äusserst froh...
Vielleicht gibt es sogar andere, bessere Wege nach Rom?
Grüsse, Tecla
 
Hallo,

überschreib die Equals-Methode von deinen Objekten und verwende die Contains-Methode von der Liste.

C#:
using System;
using System.Collections.Generic;
using System.Text;

namespace ListComparingExample
{
    class Program
    {
        static void Main(string[] args)
        {
            List<IBubu> bubus = new List<IBubu>();
            IBubu firstBubu = new Bubu(5, "First");
            IBubu secondBubu = new Bubu(1, "Second");
            bubus.Add(firstBubu);
            // false
            Console.WriteLine(bubus.Contains(secondBubu));
            bubus.Add(secondBubu);
            
            foreach (IBubu bubu in bubus)
            {
                Console.WriteLine(bubu);
            }

            // true
            Console.WriteLine(bubus.Contains(secondBubu));
            Console.ReadLine();
        }

       
    }

    interface IBubu
    {
        int Id
        {
            get;
            set;
        }

        string Name
        {
            get;
            set;
        }
    }

    class Bubu:  IBubu
    {

        public Bubu(int anId, string aName)
        {
            this.id = anId;
            this.name = aName;
        }

        int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }


        string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public override bool Equals(object obj)
        {
            return this.Id == (obj as IBubu).Id;
        }

        public override string ToString()
        {
            return this.Name;
        }
    }
}

Konsolenausgabe:
Code:
False
First
Second
True

Gruß Konstantin

p.s. GetHashCode auch überschreiben!
 
Zuletzt bearbeitet von einem Moderator:
Herzlichen Dank
Endlich weiss ich, wie man das macht.
Das vereinfacht mir das Leben so ungemein!
Und gleichzeitig so unkompliziert....
Liebe Grüsse
Tecla
 
nochmal kurz zu Predicate

der Parameter der Funktion gibt dir das aktuelle Objekt aus der Liste, welches gerade geprüft werden soll.
Du müsstest also dir noch eine extra globale Variable halten die du zum Vergleich hernehmen willst.
Oder du erstellst ein anonymes delegate, dann könntest du direkt in deiner Methode prüfen.

Code:
private void Suche()
{
   searchID=andererPartner.ID;
   list.Find(FindId);
}

private void uint searchID;
private bool FindId(Prtner partner)
{
  return partner.ID==searchId);
}

anonymes Delegate:
Code:
private void meinesuchFunktion()
{
   Predicate<Partner> FindId=delegate(Partner partner)
  {
        return partner.ID==suchPartner.ID;
  };
   list.Find(FindId);
}

anonyme delegates kannst du halt innerhalb deiner Methode erstellen und brauchst so keine globalen Variablen halten.
 

Neue Beiträge

Zurück