リスト内の特定の要素を見つけるにはどうすればいいですか ? 質問する

リスト内の特定の要素を見つけるにはどうすればいいですか ? 質問する

私のアプリケーションでは次のようなリストを使用します。

List<MyClass> list = new List<MyClass>();

メソッドを使用するとAdd、 の別のインスタンスMyClassがリストに追加されます。

MyClass次のようなメソッドを提供します。

public void SetId(String Id);
public String GetId();

MyClassメソッドを使用して の特定のインスタンスを見つけるにはどうすればよいですかGetId? メソッドがあることは知っていますFindが、ここでそれが機能するかどうかはわかりません。

ベストアンサー1

ラムダ式を使用する

MyClass result = list.Find(x => x.GetId() == "xy");

注: C#にはプロパティの組み込み構文があります。getterとsetterを通常のメソッドとして記述する代わりに(Javaで慣れているように)、次のように記述します。

private string _id;
public string Id
{
    get
    {
        return _id;
    }
    set
    {
        _id = value;
    }
}

valueはsetアクセサの暗黙のパラメータです(ただし、これは今後変更される可能性があります)LDMC)。プロパティに割り当てられた値が含まれます。

このパターンはよく使われるため、C#では自動実装プロパティこれらは上記のコードの短縮版ですが、バッキング変数は非表示になっており、アクセスできません (ただし、VB のクラス内からはアクセスできます)。

public string Id { get; set; }

フィールドにアクセスするのと同じように、プロパティを簡単に使用できます。

var obj = new MyClass();
obj.Id = "xy";       // Calls the setter with "xy" assigned to the value parameter.
string id = obj.Id;  // Calls the getter.

プロパティを使用すると、リスト内の項目を次のように検索できます。

MyClass result = list.Find(x => x.Id == "xy"); 

読み取り専用プロパティが必要な場合は、自動実装プロパティを使用することもできます。

public string Id { get; private set; }

これにより、クラス内では設定できますIdが、外部からは設定できません。派生クラスでも設定する必要がある場合は、セッターを保護することもできます。

public string Id { get; protected set; }

最後に、プロパティを として宣言しvirtual、派生クラスでオーバーライドすることで、通常の仮想メソッドと同様に、ゲッターとセッターに異なる実装を提供できます。派生クラスでは、ゲッターのみ、またはセッターのみをオーバーライドできます。他のアクセサーは変更されずに継承されます。


C# 6.0 (Visual Studio 2015、Roslyn) 以降では、インライン初期化子を使用してゲッターのみの自動プロパティを記述できます。

public string Id { get; } = "A07"; // Evaluated once when object is initialized.

代わりにコンストラクタ内でゲッターのみのプロパティを初期化することもできます。ゲッターのみの自動プロパティは真実プライベート セッターを持つ自動実装プロパティとは異なり、読み取り専用プロパティです。

これは、読み取り/書き込み自動プロパティでも機能します。

public string Id { get; set; } = "A07";

C# 6.0以降では、プロパティを式本体のメンバーとして記述することもできます。

public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }

見る:.NET コンパイラ プラットフォーム ("Roslyn")
         C# の歴史 (バージョン履歴)

で始まりますC# 7.0ゲッターとセッターはどちらも式本体で記述できます。

public string Name
{
    get => _name;                                // getter
    set => _name = value;                        // setter
}

この場合、セッターは式でなければならないことに注意してください。ステートメントにすることはできません。上記の例は、C# では代入を式としてもステートメントとしても使用できるため、機能します。代入式の値は、代入自体が副作用である代入値です。これにより、一度に複数の変数に値を割り当てることができます。はx = y = z = 0と同等でありx = (y = (z = 0))、ステートメントと同じ効果がありますz = 0; y = 0; x = 0;

C# 9.0 以降では、オブジェクト初期化子で初期化できる読み取り専用 (または、より適切には 1 回だけ初期化する) プロパティを使用できます。これは現在、ゲッターのみのプロパティでは不可能です。

public string Name { get; init; }

var c = new C { Name = "c-sharp" };

requiredC# 11 以降では、クライアント コードを強制的に初期化するプロパティを使用できます。

このfieldキーワードは、C# の将来のバージョンで計画されており (C# 11 および C# 12 には組み込まれませんでした)、半自動実装プロパティで自動的に作成されたバッキング フィールドにアクセスできるようになります。

// Removes time part in setter
public DateTime HiredDate { get; init => field = value.Date(); }

public Data LazyData => field ??= new Data();

おすすめ記事