web-dev-qa-db-ja.com

C#-カスタムオブジェクトでList <T> .Find()を使用する

私は、カスタムクラスの_List<T>_を使用しようとしており、リストのContains()Find()などのメソッドを使用できるようにしています。私はちょうど演算子_==_をオーバーロードする必要があると思っていましたが、どうやらそれを行う1つの方法はFind()...でデリゲートメソッドを使用することです.

注:現時点では、Equals()メソッドをオーバーロードしてContains()メソッドを機能させていますが、Find()関数を機能させることはできませんでした。

両方を機能させるための最良の方法は何でしょうか?

Linuxでは、monoで最新のC#/.NETフレームワークバージョンを使用しています。

編集:ここに私のコードです

_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
_
40
Pacane

Find()は、パラメータとして渡す述語に一致する要素を検索するため、Equals()または==演算子とは関係ありません。

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

この場合、述部として lambda expression を使用しました。あなたはこれについて読みたいかもしれません。 Find()の場合、式は要素を取り、boolを返す必要があります。

あなたの場合、それは次のようになります:

var reponse = list.Find(r => r.Statement == "statement1")

そして、コメントの質問に答えるために、これは、ラムダ式が導入される前の.NET 2.0で同等です。

var response = list.Find(delegate (Response r) {
    return r.Statement == "statement1";
});
61
Xavier Poinas

次のように、Predicateでfindを使用できます。

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

これは、述語によって定義された条件を満たすリストの最初のオブジェクトを返します(つまり、この例ではIDを持つオブジェクトを探しています)。

44
Greg Sansom

以前の回答では、等号演算子をオーバーロードし、それを使用して、求められている要素をテストしているという事実を説明していません。その場合、コードは次のようになります。

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

または、ラムダ構文が気に入らず、object.Equals(object)をオーバーライドした場合、またはIEquatable <T>を実装している場合は、次のようにできます。

list.Find(objectToFind.Equals);
6
phoog

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);
        }
0
Shimon Doodkin

list.Find(x => x.name == "stringNameOfObjectToFind");を使用するだけで簡単です

0