我正在尝试将List<T>
与我的自定义类一起使用,并且能够在列表中使用Contains()
,Find()
等方法。我以为我只需要重载运算符==
,但显然,这样做的一种方法是使用Find()
的委托方法......
注意:现在,我已经重载了Equals()
方法以使Contains()
方法起作用,但我仍然无法使Find()
函数起作用。
让两者兼顾的最佳方式是什么?
我在Linux上使用最新的C#/ .NET框架版本和mono。
编辑:这是我的代码
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()函数搜索我的Reponse对象...
list.find("statement1"); // would return a Reponse object
答案 0 :(得分:61)
Find()将找到与您作为参数传递的谓词匹配的元素,因此它与Equals()或==运算符无关。
var element = myList.Find(e => [some condition on e]);
在这种情况下,我使用lambda expression作为谓词。您可能想要阅读此内容。在Find()的情况下,你的表达式应该带一个元素并返回一个bool。
在你的情况下,那将是:
var reponse = list.Find(r => r.Statement == "statement1")
为了回答评论中的问题,在引入lambda表达式之前,这在.NET 2.0中是等效的:
var response = list.Find(delegate (Response r) {
return r.Statement == "statement1";
});
答案 1 :(得分:44)
您可以将find与谓词一起使用,如下所示:
list.Find(x => x.Id == IdToFind);
这将返回列表中第一个符合谓词定义条件的对象(例如,在我的示例中,我正在寻找带有ID的对象)。
答案 2 :(得分:6)
以前的答案没有说明您已经重载了equals运算符并且正在使用它来测试所搜索的元素。在这种情况下,您的代码将如下所示:
list.Find(x => x == objectToFind);
或者,如果您不喜欢lambda语法,并且已经覆盖了object.Equals(object)或已经实现了IEquatable&lt; T&gt;,那么您可以这样做:
list.Find(objectToFind.Equals);
答案 3 :(得分:0)
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);
}
答案 4 :(得分:0)
很简单,只需使用
list.Find(x => x.name == "stringNameOfObjectToFind");