私は2つのコレクションを持っています。 1つはID(int)とIsIDValid(bool)変数を持ちます。その他のコレクションにはID(int)があります。 IDが2番目のコレクションに存在する場合、最初のコレクションのIsIDValidプロパティをtrueに更新したいとします。Linqクエリを使用した更新
EDIT:回答ありがとうございます。私はforeachループを使用せずに何とかそれを行うことはできますか?
私は2つのコレクションを持っています。 1つはID(int)とIsIDValid(bool)変数を持ちます。その他のコレクションにはID(int)があります。 IDが2番目のコレクションに存在する場合、最初のコレクションのIsIDValidプロパティをtrueに更新したいとします。Linqクエリを使用した更新
EDIT:回答ありがとうございます。私はforeachループを使用せずに何とかそれを行うことはできますか?
シンプル:
var validIds = new HashSet<int>(other.Select(x => x.Id));
var query = firstCollection.Where(x => validIds.Contains(x.Id));
foreach (var item in query)
{
item.IsIdValid = true;
}
これは動作します:
var valid = firstCollection.Where(f=> secondCollection.Any(s=> s.ID == f.ID));
foreach (var v in valid) { v.IsValid = true; }
This SO answerは、LINQを使用して複数行の更新に関する詳細な情報を持っています。 Jonの線に沿って
、あなたはまた、LINQの
あなたはLINQの2つのセットをマージするのではなく、明示的にHashSetのあなた自身を構築するための戦略を選んだせている以外、基本的に同じものであるvar query = firstCollection.Join(other, fc => fc.Id, o => o.Id, (fc, o) => fc);
foreach (var item in query)
{
item.IsIdValid = true;
}
に参加し使用することができます。私はカバーの下でより効率的であるかどうか分かっていないが、私は結合が少なくとも良いと思った。
foreach:いいえ、常に少なくとも1回は最初のコレクションを反復処理する必要があります。これらの答えはすべて一度だけ行います。あなたは何を避けることを望んでいますか? – Rup
これを避ける唯一の方法は、LINQクエリラムダの1つの要素を変更するハックです。良いスタイルは、コレクションを不変として扱い、LINQなしで結果を変更することです。 – Grozz