この質問にはすでに答えがあります。
追加しようとしていますSELECT ALL
LINQを使用してグリッドに機能を追加しましたが、コンパイルエラーが発生しました。
List<Person_> PeopleUpdated = People.ToList().ForEach(a => a.SELECTED = true).ToList();
それは言う
タイプ 'void'を暗黙的に変換できません 'System.Collections.Generic.List< LogoSapHrIntegration.frmXmlUpload.Person_> '
何が悪いの?
のList<T>.ForEach
戻り値がない(つまりvoid)ので、実行することはできませんToList()
それに対して。 (見るMSDN)
ForEach
リスト内の各項目に対する特定のアクション(実際のものと同じです)for
ループ)。
あなたの場合、すべてを選択するための単純なforループが最も効率的です。
foreach (var person in People)
person.Selected = true
People
平野foreach
ループははるかに単純で効率的です。 - RangoPeopleUpdated
同時に一覧表示します。 OPはこれをワンライナーにしたいと考えていますが、それが可能かどうかはわかりません。 - Jon Egertonforeach(var p in People) p.SELECTED = true;
?タイトルによると、OPは元のリストを更新したいのですが、新しいリストを作成する必要はありません。 - RangoSelected
本当です。 - Yuval Itzchakov
List<T>.ForEach
戻るvoid
(あなたの場合、それはあなたのコレクションを適切に変更します)。ForEach
かかりますAction<T>
そしてそれをあなたのリストの各項目で実行します。
まず第一に、あなたは通常のを使用することができますforeach
ループ:
foreach (var person in people)
{
person.Selected = true;
}
これは最も単純で最もきれいな方法です。
本当にフープにジャンプしてLINQを使いたいのであれば、ConvertAll
:
var list = new List<Person> { new Person(), new Person() };
var convertedPeople = list.ConvertAll(person =>
{
person.Selected = true;
return person;
});
Select all
機能は、あなたがしたくないだろうセットすべてSelected
プロパティをtrue
? - Yuval Itzchakov
のForEeach
method(これはLINQではありません)はリスト内の各項目に対してアクションを実行します。リストから項目を除外するためには使用されないため、結果は返されません。
各項目に対してメソッドを実行するだけです。割り当てる結果はありません。
People.ToList().ForEach(a => a.SELECTED = true);
プロパティが変更されたアイテムの新しいリストが必要な場合は、アイテムを複製して元のアイテムと区別する必要があります。
List<Person_> PeopleUpdated = People.ToList().Select(a => {
Person_ b = a.Clone();
b.SELECTED = true;
return b;
}).ToList();
(クラスがクローン作成をサポートしていない場合は、次のものを実装する必要があります。Clone
方法(そしてできればIClonable
インタフェース)。)
foreach(var p in People) p.SELECTED = true;
? - RangoPeople
ですIEnumerable
? - Yuval Itzchakovperson
の選択されたフィールド/プロパティ、またはフィルタリングしようとしていますかSELECTED
人。後者ならば.Where(a => a.SELECTED)
- StuartLCPeopleUpdated
含むはずの? - 選択されたすべての人のリスト、または選択されるように更新された(つまりまだ選択されていない)人のリスト。それともただの間違いですか? - Jon Egerton