С# - использование 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
Ответы
Ответ 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");