C# - 使用List <t> .Find()和自定义对象</t>

时间:2010-12-21 01:57:29

标签: c# list generics delegates 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;
    }
}

}

以及我想如何使用find()函数搜索我的Reponse对象...

list.find("statement1"); // would return a Reponse object

5 个答案:

答案 0 :(得分:61)

Find()将找到与您作为参数传递的谓词匹配的元素,因此它与Equals()或==运算符无关。

var element = myList.Find(e => [some condition on e]);

在这种情况下,我使用lambda expression作为谓词。您可能想要阅读此内容。在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";
});

答案 1 :(得分:44)

您可以将find与谓词一起使用,如下所示:

list.Find(x => x.Id == IdToFind);

这将返回列表中第一个符合谓词定义条件的对象(例如,在我的示例中,我正在寻找带有ID的对象)。

答案 2 :(得分:6)

以前的答案没有说明您已经重载了equals运算符并且正在使用它来测试所搜索的元素。在这种情况下,您的代码将如下所示:

list.Find(x => x == objectToFind);

或者,如果您不喜欢lambda语法,并且已经覆盖了object.Equals(object)或已经实现了IEquatable&lt; T&gt;,那么您可以这样做:

list.Find(objectToFind.Equals);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

很简单,只需使用     list.Find(x => x.name == "stringNameOfObjectToFind");