Frage

Ich wanderte wie kann ich herausfinden, ob ein Objekt bereits in meiner Liste existiert. Ich füge „newPerson“ (Instanz von Person-Klasse) in einer Liste, aber überprüfen, ob newPerson Inhalte / Objekte existieren oder nicht in der Liste.

Dieses Stück funktioniert:

        List<Person> people = this.GetPeople();
        if (people.Find(p => p.PersonID  == newPerson.PersonID
                    && p.PersonName  == newPerson.PersonName) != null)
        {
            MessageBox.Show("This person is already in the party!");
            return;
        }

Zunächst einmal wollte ich diesen hässlichen Code oben vereinfachen / optimieren. Also dachte ich über Methode enthält.

        List<Person> people = this.GetPeople();
        if (people.Contains<Person>(newPerson)) //it doesn't work!
        {
            MessageBox.Show("This person is already in the party!");
            return;
        }

Der zweite Code oben nicht funktioniert, ich denke, dass es Objekte Referenzen und nicht Objekt Inhalt / Eigenschaften zu vergleichen.

Jemand hier auf Stackoverflow und in Linktext spricht über eine Klasse verwenden, die IEqualityComparer implementiert. Ich habe es ausprobiert, aber der Code ist jetzt viel größer! So etwas wie:

    public class PersonComparer : IEqualityComparer<Person>
    {
    // Products are equal if their names and i numbers are equal.
    public bool Equals(Person x, Person y)
    {

        // Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        // Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        // Check whether the products' properties are equal.
        return x.PersonID == y.PersonID && x.PersonName == y. PersonName;
    }

    // If Equals() returns true for a pair of objects,
    // GetHashCode must return the same value for these objects.

    public int GetHashCode(Person p)
    {
        // Check whether the object is null.
        if (Object.ReferenceEquals(p, null)) return 0;

        // Get the hash code for the Name field if it is not null.
        int hashPersonName = p.PersonName == null ? 0 : p.PersonName.GetHashCode();
        int hashPersonID = i.PersonID.GetHashCode();

        // Calculate the hash code for the i.
        return hashPersonName ^ hashPersonID;
    }

}

und diesen Vergleich zu verwenden:

        PersonComparer comparer = new PersonComparer();
        if (people.Contains<Person>(newPerson, comparer))
        {
            MessageBox.Show("This person is already in the party.");
            return;
        }

Gibt es einen kleinen Weg, um meine Eigenschaften des Objekt in einer Liste?

finden
War es hilfreich?

Lösung

Verwenden Exists oder Any mit einem Prädikat:

List<Person> people = this.GetPeople();
if (people.Exists(p => p.PersonID  == newPerson.PersonID
                       && p.PersonName  == newPerson.PersonName))
{  
    MessageBox.Show("This person is already in the party!");
    return;
}

Das funktioniert mit .NET 2.0 (und kann auf C # 2 unter Verwendung einer anonyme Methode umgewandelt werden). Je mehr LINQy Lösung ist Any:

List<Person> people = this.GetPeople();
if (people.Any(p => p.PersonID  == newPerson.PersonID
                    && p.PersonName  == newPerson.PersonName))
{
    MessageBox.Show("This person is already in the party!");
    return;
}

Andere Tipps

Es klingt wie Ihre Klasse Person sollte implementieren IEquatable . Ja, es ist (etwas) mehr Code, aber dann haben Sie es nicht jedes Mal, wenn Sie mit 2 Personen Objekte vergleichen wollen zu wiederholen.

Die Contains-Methode der Liste der Equals-Methode des Objekts standardmäßig verwendet. Also, wenn Sie IEquatable korrekt implementieren, müssen Sie eine benutzerdefinierte IEqualityComparer passieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top