1

リストを区別するものを書き込もうとしています。複数が見つかった場合は、個別のリスト内にプロパティを設定します。何かが何回発生したかのカウンターや、発生の最後の日付などです。これは私がこれまでに持っているものです。

foreach(DataObject srcObj in ilSource){
    if (ilDest.All(x => x.Property1 != srcObj.Property1 || x.srcObj != srcObj.Property2))
        ilDest.Add(srcObj);
    else
        DataObject newObject = ilDest.SingleOrDefault(x => x.Property1 == srcObj.Property1 && x.Property2 == srcObj.Property2);
        newObject.Propert3++;
        newObject.Property4 = srcObj.Property5;
}

オブジェクトがコレクション内に戻っていないため、次の反復が発生すると、newObject プロパティは保持されません。Linq がなければ、オブジェクトの真のコピーがあるため、コレクションを手動で繰り返し、オブジェクトを取得して変更を加え、次の作業に進みます。

あなたが貢献できる助けを前もって感謝します

4

1 に答える 1

1

これは、あなたが求めていることの私の最良の解釈です。

これを試して:

var query =
    from srcObj in ilSource
    orderby srcObj.Property5
    group srcObj by new
    {
        srcObj.Property1,
        srcObj.Property2,
    } into gs
    select new
    {
        First = gs.First(),
        Last = gs.Last(),
        Count = gs.Count(),
    };

foreach (var x in query)
{
    x.First.Property3 = x.Count;
    x.First.Property4 = x.Last.Property5;
}

var ilDest = query
    .Select(x => x.First)
    .ToList();

foreachLINQ は更新ではなくクエリに関するものであるため、既存のオブジェクトの変更にはループが必要です。

それにもかかわらず、私はあなたのコードを「修正」し、私の答えが同じ結果を生み出すようにしました. 修正したコードは次のようになります。

foreach(DataObject srcObj in ilSource)
{
    if (ilDest.All(x =>
            x.Property1 != srcObj.Property1 || x.Property2 != srcObj.Property2))
        ilDest.Add(srcObj);
    else
    {
        DataObject newObject = ilDest.SingleOrDefault(x =>
            x.Property1 == srcObj.Property1 && x.Property2 == srcObj.Property2);
        newObject.Property3++;
        newObject.Property4 = srcObj.Property5;
    }
}
于 2012-11-01T03:02:18.850 に答える