簡體   English   中英

C# - 使用List <T> .Find()和自定義對象

[英]C# - using List<T>.Find() with custom objects

我正在嘗試使用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

Find()將找到與您作為參數傳遞的謂詞匹配的元素,因此它與Equals()或==運算符無關。

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

在這種情況下,我使用lambda表達式作為謂詞。 您可能想要閱讀此內容。 在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";
});

您可以將find與謂詞一起使用,如下所示:

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

這將返回列表中第一個滿足謂詞定義條件的對象(即在我的示例中,我正在尋找具有ID的對象)。

以前的答案沒有考慮到你已經重載了equals運算符並且正在使用它來測試所尋找的元素。 在這種情況下,您的代碼將如下所示:

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

這很簡單,只需使用list.Find(x => x.name == "stringNameOfObjectToFind");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM