5

Linqを使用して次のことを行う方法はありますか?

foreach (var c in collection)
{
    if (c.Condition == condition)
    {
        c.PropertyToSet = value;
        // I must also check I only set this value to one minimum and only one element.
    }
    else
    {
        c.PropertyToSet = otherValue;
    }
}

明確にするために、コレクション内の各オブジェクトを反復処理してから、別の値に更新する必要があるコレクションの1つの要素を除いて、各オブジェクトのプロパティを更新します。

この時点で、カウンターを使用して、値をコレクションの1つの要素のみに設定したことを確認します。他の解決策を提案できるように、この例から削除しました。

コレクションの例外なく元の質問はここにあります

編集

LinQでそれが可能かどうかわからないので、この質問をします。だからあなたの答えはLinQについての私の意見を慰めます。ありがとうございました。

4

6 に答える 6

8

を使用.ForEachして変更を加え、.Single1つの要素のみが条件に一致することを確認できます。

// make sure only one item matches the condition
var singleOne = collection.Single(c => c.Condition == condition);
singleOne.PropertyToSet = value;

// update the rest of the items
var theRest = collection.Where(c => c.Condition != condition);
theRest.ToList().ForEach(c => c.PropertyToSet = otherValue);
于 2013-03-13T15:31:44.100 に答える
6

これをLinqで実装することはお勧めしません。なんで?Linqはクエリ用であり、変更用ではないためです。ある条件に一致するオブジェクト、または一致しないオブジェクトを返すことができます。ただし、これらのオブジェクトを更新するには、クエリ結果を使用するか、拡張機能foreachをリストして使用するように変換する必要があります。どちらもシーケンスを2回ForEach列挙する必要があります。

したがって、単純なループがその役割を果たします。

foreach (var c in collection)
{
    c.PropertyToSet = (c.Condition == condition) ? value : otherValue;
}
于 2013-03-13T15:36:38.037 に答える
2
collection.Where(x => <condition>).ToList().ForEach(x => <action>);
于 2013-03-13T15:31:26.923 に答える
2

使い続ける場合にLINQを使用するハッキーな方法:

var result = collection.Select(c =>
{
    c.PropertyToSet = c.Condition == condition ? value : otherValue;
    return c;
});

しかし、私の推奨事項は、これを行わないでください。コードは実際に最良のアプローチを取得します。読みやすくするために、次のように変更できます。

foreach (var c in collection)
   c.PropertyToSet = c.Condition == condition ? value : otherValue;
于 2013-03-13T15:40:22.063 に答える
2

三項演算子は、linqステートメントと組み合わせて使用​​できます。

    collection.ToList().ForEach(c => c.PropertyToSet = c.Condition == condition ? value : otherValue);

ただし、コレクションがリストに変換されないように、ここでは通常のforeachを使用します。

于 2013-03-13T15:40:34.170 に答える
1

まあ、あなたはすることができます:

var itemToSetValue = collection.FirstOrDefault(c => c.Condition == condition);

if(itemToSetValue != null)
     itemToSetValue.PropertyToSet = value;

// Depending on what you mean, this predicate 
// might be c => c != itemToSetValue instead.
foreach (var otherItem in collection.Where(c => c.Condition != condition))
{
    otherItem.PropertyToSet = otherValue;
}

もちろん、これは純粋なLINQソリューションではありませんが、純粋なLINQソリューションは既存のコレクションの変更には適していません。

于 2013-03-13T15:36:40.847 に答える