wake-up-neo.com

C # - Verwenden von List <T> .Find () mit benutzerdefinierten Objekten

Ich versuche, einen List<T> mit einer benutzerdefinierten Klasse von mir zu verwenden, und ich kann Methoden wie Contains(), Find() usw. in der Liste verwenden. Ich dachte, ich müsste nur den Operator == überladen, aber anscheinend besteht eine Möglichkeit darin, eine Delegat-Methode mit der Find()... zu verwenden.

Hinweis: Im Moment habe ich die Equals()-Methode überladen, um die Contains()-Methode zum Laufen zu bringen, aber die Find()-Funktion konnte immer noch nicht funktionieren.

Was wäre der beste Weg, um beide zur Arbeit zu bringen?

Ich verwende die neueste C # /.NET-Framework-Version mit Mono unter Linux.

edit: Hier ist mein Code

using System;
namespace GuerreDesClans
{
public class Reponse : IEquatable<Reponse>
{
    public Reponse ()
    {
        m_statement = string.Empty;
        m_pointage = 0;
    }

    public Reponse (string statement, int pointage)
    {
        m_pointage = pointage;
        m_statement = statement;
    }


    /*
     * attributs privés
     */

    private string m_statement;
    private int m_pointage;


    /*
     * properties
     */

    public string Statement {
        get { return m_statement; }
        set { m_statement = value; }
    }

    public int Pointage {
        get { return m_pointage; }
        set { m_pointage = value; }
    }

    /*
     * Equatable
     */

    public bool Equals (Reponse other)
    {
        if (this.m_statement == other.m_statement)
            return true;
        else
            return false;
    }
}

}

und wie ich meine Antwortobjekte mit der find () - Funktion durchsuchen möchte ...

list.find("statement1"); // would return a Reponse object
38
Pacane

Find () findet das Element, das mit dem als Parameter übergebenen Prädikat übereinstimmt, und ist daher nicht mit Equals () oder dem Operator == verknüpft.

var element = myList.Find(e => [some condition on e]);

In diesem Fall habe ich einen Lambda-Ausdruck als Prädikat verwendet. Vielleicht möchten Sie darüber lesen. Im Fall von Find () sollte Ihr Ausdruck ein Element annehmen und ein bool zurückgeben.

In Ihrem Fall wäre das:

var reponse = list.Find(r => r.Statement == "statement1")

Und um die Frage in den Kommentaren zu beantworten, ist dies das Äquivalent in .NET 2.0, bevor Lambda-Ausdrücke eingeführt wurden:

var response = list.Find(delegate (Response r) {
    return r.Statement == "statement1";
});
58
Xavier Poinas

Sie können find mit einem Prädikat wie folgt verwenden:

list.Find(x => x.Id == IdToFind);

Dadurch wird das erste Objekt in der Liste zurückgegeben, das die durch das Prädikat definierten Bedingungen erfüllt (dh ich suche in meinem Beispiel nach einem Objekt mit einer ID).

44
Greg Sansom

Frühere Antworten berücksichtigen nicht die Tatsache, dass Sie den Gleichheitsoperator überladen haben und dies zum Testen des gesuchten Elements verwenden. In diesem Fall würde Ihr Code folgendermaßen aussehen:

list.Find(x => x == objectToFind);

Wenn Sie die Lambda-Syntax nicht mögen und object überschreiben möchten. Equals (object) oder IEquatable <T> implementiert haben, können Sie Folgendes tun:

list.Find(objectToFind.Equals);
6
phoog

http://msdn.Microsoft.com/de-de/library/x0b5b5bc.aspx

        // Find a book by its ID.
        Book result = Books.Find(
        delegate(Book bk)
        {
            return bk.ID == IDtoFind;
        }
        );
        if (result != null)
        {
            DisplayResult(result, "Find by ID: " + IDtoFind);   
        }
        else
        {
            Console.WriteLine("\nNot found: {0}", IDtoFind);
        }
1
Shimon Doodkin

Es ist ganz einfach, benutze einfach list.Find(x => x.name == "stringNameOfObjectToFind");

0