Подтвердить что ты не робот

С# - использование List <T>.Find() с пользовательскими объектами

Я пытаюсь использовать List<T> с моим собственным классом и иметь возможность использовать в списке такие методы, как Contains(), Find() и т.д. Я думал, что мне просто нужно перегрузить оператор ==, но, видимо, один из способов сделать это - использовать метод делегата с Find()...

Примечание. В настоящий момент я перегрузил метод Equals(), чтобы получить метод Contains(), но я все еще не мог заставить функцию Find() работать.

Каким будет лучший способ заставить обоих работать?

Я использую последнюю версию фреймворка С#/.NET с моно, на linux.

edit: Здесь мой код

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;
    }
}

}

и как я хотел бы искать объекты Ответа с помощью функции find()...

list.find("statement1"); // would return a Reponse object
4b9b3361

Ответ 1

Найти() найдет элемент, который соответствует предикату, который вы передаете в качестве параметра, поэтому он не связан с оператором Equals() или ==.

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

В этом случае я использовал выражение лямбда как предикат. Вы можете прочитать об этом. В случае Find() ваше выражение должно взять элемент и вернуть bool.

В вашем случае это будет:

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

И чтобы ответить на вопрос в комментариях, это эквивалент в .NET 2.0, прежде чем появятся лямбда-выражения:

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

Ответ 2

Вы можете использовать find с предикатом следующим образом:

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

Это вернет первый объект в списке, который удовлетворяет условиям, определенным предикатом (т.е. в моем примере я ищу объект с идентификатором).

Ответ 3

Предыдущие ответы не учитывают тот факт, что вы перегрузили оператор equals и используете это для проверки искомого элемента. В этом случае ваш код будет выглядеть так:

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

Или, если вам не нравится синтаксис лямбда, и у вас есть переопределенный объект. Элементы (объект) или реализованы IEquatable <T> , вы можете сделать это:

list.Find(objectToFind.Equals);

Ответ 4

http://msdn.microsoft.com/en-us/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);
        }

Ответ 5

Это просто, просто используйте list.Find(x => x.name == "stringNameOfObjectToFind");