C # - использование List <T>.Find () с пользовательскими объектами - PullRequest
39 голосов
/ 21 декабря 2010

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

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

Каков был бы лучший способ заставить оба работать?

Я использую последнюю версию платформы C # / .NET с mono для 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;
    }
}

}

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

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

Ответы [ 5 ]

61 голосов
/ 21 декабря 2010

Find () найдет элемент, соответствующий предикату, который вы передаете в качестве параметра, поэтому он не связан с 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";
});
44 голосов
/ 21 декабря 2010

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

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

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

6 голосов
/ 21 декабря 2010

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

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

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

list.Find(objectToFind.Equals);
0 голосов
/ 02 декабря 2018

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

0 голосов
/ 08 февраля 2013

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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...