Pac*_*ane 42 c# generics delegates list find
我试图用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;
}
}
Run Code Online (Sandbox Code Playgroud)
}
以及我如何使用find()函数搜索我的Reponse对象...
list.find("statement1"); // would return a Reponse object
Run Code Online (Sandbox Code Playgroud)
Xav*_*nas 63
Find()将找到与您作为参数传递的谓词匹配的元素,因此它与Equals()或==运算符无关.
var element = myList.Find(e => [some condition on e]);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我使用lambda表达式作为谓词.您可能想要阅读此内容.在Find()的情况下,您的表达式应该采用一个元素并返回一个bool.
在你的情况下,那将是:
var reponse = list.Find(r => r.Statement == "statement1")
Run Code Online (Sandbox Code Playgroud)
为了回答评论中的问题,在引入lambda表达式之前,这在.NET 2.0中是等效的:
var response = list.Find(delegate (Response r) {
return r.Statement == "statement1";
});
Run Code Online (Sandbox Code Playgroud)
Gre*_*som 46
您可以将find与谓词一起使用,如下所示:
list.Find(x => x.Id == IdToFind);
Run Code Online (Sandbox Code Playgroud)
这将返回列表中第一个满足谓词定义条件的对象(即在我的示例中,我正在寻找具有ID的对象).
以前的答案没有考虑到你已经重载了equals运算符并且正在使用它来测试所寻找的元素.在这种情况下,您的代码将如下所示:
list.Find(x => x == objectToFind);
Run Code Online (Sandbox Code Playgroud)
或者,如果您不喜欢lambda语法,并且已经覆盖了object.Equals(object)或已经实现了IEquatable <T>,那么您可以这样做:
list.Find(objectToFind.Equals);
Run Code Online (Sandbox Code Playgroud)