在foreach中编辑属性不会影响集合



我编了一个测试用例:

我有一个这样的表

Id|IdA|IdW|Quantity
1  1   3    5
2  1   4    2
3  2   5    3

Id为主键,IdA为文章id, IdW为框id, quantity为文章数量。

现在我要按IdA求和分组,所以我在做:

var groups = 
        models
            .GroupBy(x => new { x.IdA })
            .Select
            (
                x => 
                    new Model
                    { 
                        Id = (x.Select(y => y.Id).Count() > 1) ? 0 : x.Select(y => y.Id).First(), 
                        IdA = x.Key.IdA, 
                        Qty = x.Sum(y => y.Qty) 
                    }
            );

这里models是上面的表。它工作得很好,我还设法在没有分组时保持主键(只有一个IdA)

现在我想这样做:我想保留那些没有分组的IdW。理想的结果是:

Id|IdA|IdW|Quantity
0  1   0    7
3  2   5    3

我尝试对组进行foreach,使用主键检索行,然后将IdW设置为组,如下所示:

foreach(var e in groups)
{
    var nonGroupedRow = models.Where(x => e.Id != 0 && x.Id == e.Id).FirstOrDefault();
    var targetModel = groups.FirstOrDefault(x => x.Id == e.Id);
    if(nonGroupedRow != null && targetModel != null)
    {
        targetModel.IdW = nonGroupedRow.IdW;
    }
}

这不可思议地不起作用。两组仍然有IdW = 0。为了确保这一点,我还做了另一个测试:

void Main()
{
    var a = new List<A> { new A { Id = 1 }, new A { Id = 2 } };
    a.FirstOrDefault(x => x.Id == 1).Id = 2;
    // both have Id = 2
}
class A
{
    public long Id {get;set;}
}

它只需要在我的头脑中工作,也考虑到上面的例子,但它不是。我哪里错了?

首先,你的计数是计算在组中找到的条目的数量所以你不需要指定它来计数id,它将是相同的

第二点,获取第一个条目的Id也是一样,从分组数据中获取第一个条目然后从那里获取Id属性

你基本上有答案了

var groups = 
      models
        .GroupBy(x => new { x.IdA })
        .Select
        (
            x => 
                new Model
                { 
                    Id = (x.Count() > 1) ? 0 : x.First().Id, 
                    IdA = x.Key.IdA,
                    IdW = (x.Count() > 1) ? 0 : x.First().IdW,
                    Qty = x.Sum(y => y.Qty) 
                }
        );