C#-使用列表<;T>;。使用自定义对象查找()
我试图将C#-使用列表<;T>;。使用自定义对象查找(),c#,list,generics,delegates,find,C#,List,Generics,Delegates,Find,我试图将列表与我的自定义类一起使用,并且能够在列表上使用Contains(),Find()等方法。我想我只需要重载操作符==,但显然,一种方法是在Find()中使用委托方法 注意:现在,我重载了Equals()方法以使Contains()方法工作,但仍然无法使Find()函数工作 让两者都发挥作用的最佳方式是什么 我正在linux上使用mono的最新C#/.NET framework版本 编辑:这是我的代码 using System; namespace GuerreDesClans { pub
列表
与我的自定义类一起使用,并且能够在列表上使用Contains()
,Find()
等方法。我想我只需要重载操作符==
,但显然,一种方法是在Find()
中使用委托方法
注意:现在,我重载了Equals()
方法以使Contains()
方法工作,但仍然无法使Find()
函数工作
让两者都发挥作用的最佳方式是什么
我正在linux上使用mono的最新C#/.NET framework版本
编辑:这是我的代码
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(x => x.Id == IdToFind);
这将返回列表中满足谓词定义条件的第一个对象(即在我的示例中,我正在查找具有ID的对象)。Find()将查找与作为参数传递的谓词匹配的元素,因此它与Equals()或==运算符无关
var element = myList.Find(e => [some condition on e]);
在本例中,我使用了a作为谓词。你可能想看看这个。对于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";
});
前面的答案不能解释您重载了equals运算符并使用它来测试所查找的元素的事实。在这种情况下,您的代码如下所示:
list.Find(x => x == objectToFind);
或者,如果您不喜欢lambda语法,并且已重写object.Equals(object)或已实现IEquatable,则可以执行以下操作:
list.Find(objectToFind.Equals);
它很简单,只要使用
list.Find(x=>x.name==“stringNameOfObjectToFind”)
这种技术叫什么?@Pacane:From msdn-所有lambda表达式都使用lambda运算符=>,该运算符被解读为“goes to”。这些语句都是多余的,因为我们已经有了对objectToFind的引用。Find()的作用是定位一个我们没有引用的对象。使用list.Contains(objectToFind)更容易、更具逻辑性和可读性。@Greg Sansom:当然。但OP明确表示,他有Contains方法可以工作,但也希望使用Find。由于他重写了Equals来比较m_语句并忽略m_pointage的值,Find方法不一定返回传递给它的同一个实例。Equals重写的行为可能有问题,但鉴于这种行为,list.Find(obj.Equals)
不是多余的。您能提供一个.NET 2.0示例吗?我在Unity3D中,它被困在.net 2.0中,认为返回的元素将是一个引用,对它的任何修改都将反映在列表中包含的同一个元素上,这样可以吗?@HugoAllexisCardona如果元素的类型是引用类型,那么可以。如果是值类型,则为否。请参阅。如果找不到元素,如何处理?@OlivierPons如果列表包含引用类型,如果找不到元素,则Find将返回null。如果列表包含值类型,如果找不到元素,它将返回该类型的默认值。在这种情况下,无法知道是否找到了元素,除非默认值与谓词不匹配。
list.Find(objectToFind.Equals);
// 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);
}