0

特定のアイテムを更新したいBindingListがありますが、 List <>でのみ使用可能なForeachを使用するには、BindingListアイテムを使用して新しいリストを初期化する必要があります。このような:

new List<ScanData>(ScanDataList)
.FindAll(i => i.Badge == badge)
.ForEach(x =>x.EmpName = empname);

これが私が見つけた最も簡単な方法ですが、 Newキーワードから始めたくありません。BindingListアイテムを反復処理し、上記のようなワンライナーを使用して更新する他の簡単な方法はありますか?(読みやすくするために3行にまとめました)。Newキーワードを削除したいのですが、それは機能しません。新しい関数が役立つ場合、それが受け入れられる場合、BindingListのジェネリックが完全である場合。

  • 注:コンパクトフレームワーク2.0を使用しています
  • 変数を初期化したくありません。使用しません。

ありがとう。

4

1 に答える 1

1

この質問は少しばかげています。1 行のコードで実行し、変数の宣言を避ける必要がある理由はありません。new 演算子を使用すると、変数を宣言しているかどうかに関係なく、オブジェクトのインスタンスを初期化しています。

そうは言っても、あなたの ScanDataList が何であるかわかりません... Where と呼ばれる FindAll に相当する linq 式があり、FindAll よりも効率的である可能性があります (新しいリストを作成する必要がないため、遅延反復するだけです)。ScanDataList が既に IEnumerable である場合、おそらく次のようなことができます...

ScanDataList.Where(i => i.Badge == バッジ).ToList().ForEach(x=>x.EmpName = empname);

ScanDataList が列挙可能でない場合でも、これを達成するのに役立つ独自の拡張メソッドを実装できますが、恣意的な不必要な制約 (新規なし、変数なしなど) なしで簡単に達成できるものには多くの作業が必要なようです。 )。

明確にするために、おそらく .Where LINQ 式を使用します。これは、新しいリストを作成する必要がないため、おそらくもう少し効率的だからです。ただし、同じロジックを使用すると、おそらく ToList() を避けて、コードを次のように 2 行に分けます。

foreach(Employee emp in ScanDataList.Where(i => i.badge == badge))
  emp.EmpName = empname;

この方法では、追加のリストは作成されません。

于 2012-10-10T21:19:30.230 に答える