C# – 使用List <T> .Find()与自定义对象
我试图使用一个List<T>
与我的自定义类,并能够在列表中使用像Contains()
, Find()
等方法。 我想我只是要重载运算符==
但显然,这样做的一种方法是使用Find()
的委托方法…
注意:现在,我重载了Equals()
方法来使Contains()
方法正常工作,但我仍然无法使Find()
函数正常工作。
双方工作的最好方法是什么?
我在Linux上使用最新的C#/ .NET框架版本。
编辑:这是我的代码
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()函数search我的Reponse对象…
list.find("statement1"); // would return a Reponse object
Find()将查找与作为parameter passing的谓词相匹配的元素,因此它与Equals()或==运算符无关。
var element = myList.Find(e => [some condition on e]);
在这种情况下,我使用了lambdaexpression式作为谓词。 你可能想阅读这个。 在Find()的情况下,你的expression式应该带一个元素并返回一个bool。
在你的情况下,这将是:
var reponse = list.Find(r => r.Statement == "statement1")
为了回答评论中的问题,在引入lambdaexpression式之前,这在.NET 2.0中是等价的:
var response = list.Find(delegate (Response r) { return r.Statement == "statement1"; });
您可以使用Predicate使用find,如下所示:
list.Find(x => x.Id == IdToFind);
这将返回列表中符合由谓词定义的条件的第一个对象(即在我的示例中,我正在查找具有ID的对象)。
以前的答案没有说明你已经重载了等号运算符,并正在使用它来testing查找的元素。 在这种情况下,你的代码如下所示:
list.Find(x => x == objectToFind);
或者,如果你不喜欢lambda语法,并且覆盖object.Equals(object)或者实现了IEquatable <T>,你可以这样做:
list.Find(objectToFind.Equals);
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); }