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();

现有对象的修改需要一个foreach循环,因为 LINQ 是关于查询而不是更新。

尽管如此,我“修复”了您的代码并使我的答案产生了相同的结果。您的固定代码应如下所示:

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 回答