it-roy-ru.com

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

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

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

Что было бы лучшим способом заставить обоих работать?

Я использую последнюю версию C #/.NET Framework с моно, на Linux.

Правка: вот мой код

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
38
Pacane

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";
});
58
Xavier Poinas

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

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

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

44
Greg Sansom

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

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

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

list.Find(objectToFind.Equals);
6
phoog

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);
        }
1
Shimon Doodkin

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

0
Juned Khan Momin