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