0

この質問にはすでに答えがあります。

追加しようとしていますSELECT ALLLINQを使用してグリッドに機能を追加しましたが、コンパイルエラーが発生しました。

List<Person_> PeopleUpdated = People.ToList().ForEach(a => a.SELECTED = true).ToList();

それは言う

タイプ 'void'を暗黙的に変換できません   'System.Collections.Generic.List<   LogoSapHrIntegration.frmXmlUpload.Person_> '

何が悪いの?


  • 何が悪いのか:foreach(var p in People) p.SELECTED = true;? - Rango
  • PeopleですIEnumerable? - Yuval Itzchakov
  • それぞれを変えようとしていますかpersonの選択されたフィールド/プロパティ、またはフィルタリングしようとしていますかSELECTED人。後者ならば.Where(a => a.SELECTED) - StuartLC
  • 何ですかPeopleUpdated含むはずの? - 選択されたすべての人のリスト、または選択されるように更新された(つまりまだ選択されていない)人のリスト。それともただの間違いですか? - Jon Egerton

4 답변


4

List<T>.ForEach戻り値がない(つまりvoid)ので、実行することはできませんToList()それに対して。 (見るMSDN

ForEachリスト内の各項目に対する特定のアクション(実際のものと同じです)forループ)。

あなたの場合、すべてを選択するための単純なforループが最も効率的です。

foreach (var person in People)
    person.Selected = true


  • OPがすべての人を更新したい場合は、People平野foreachループははるかに単純で効率的です。 - Rango
  • @TimSchmelter:同意しました - それの厄介な部分はで終わっていますがPeopleUpdated同時に一覧表示します。 OPはこれをワンライナーにしたいと考えていますが、それが可能かどうかはわかりません。 - Jon Egerton
  • これは「ワンライナー」ではありません:foreach(var p in People) p.SELECTED = true;?タイトルによると、OPは元のリストを更新したいのですが、新しいリストを作成する必要はありません。 - Rango
  • みんな、重要なのは、自分がやりたいことが完全には明確になっていないということです。 - Leo
  • @レオなぜそれが明確でないのですか?それは私にとってはっきりしています。 OPは設定するコレクションを繰り返していますSelected本当です。 - Yuval Itzchakov

1

List<T>.ForEach戻るvoid(あなたの場合、それはあなたのコレクションを適切に変更します)。ForEachかかりますAction<T>そしてそれをあなたのリストの各項目で実行します。

見るMSDN上のリスト(T).ForEach


  • 誰が投票したのかわからない - Leo

0

まず第一に、あなたは通常のを使用することができます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機能を追加しようとしています。" - Leo
  • @Leoさて、あなたが追加したい場合はSelect all機能は、あなたがしたくないだろうセットすべてSelectedプロパティをtrue? - Yuval Itzchakov

0

ForEeachmethod(これは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インタフェース)。)


  • なぜあなたはアイテムを複製する必要があるのでしょうか? - Magnus
  • @ Magnus:値を変更した新しいリストが欲しいなら、あなたはそれをする必要があるでしょう。それ以外の場合は、元のリストの項目も変更されます。 - Guffa
  • それがポイントだと思います。 - Magnus
  • @マグナス:おそらく、そうではありません。元のコードでは、結果として新しいリストがありました。そのような結果を作成するために必要なものを表示するためのコードを追加しました。 - Guffa

リンクされた質問


関連する質問

最近の質問