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); }