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

时间:2016-09-02 16:24:18

标签: c# grouping

我编写了一个测试用例:

我有一张这样的表

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

Id是主键,IdA是文章ID,IdW是框ID,数量是文章数量。

现在我必须按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;}
}

它只需要在我的头脑中工作,也给出了上面的例子,但事实并非如此。我哪里错了?

1 个答案:

答案 0 :(得分:0)

首先,您的计数是计算在组中找到的条目数量,因此您无需指定它来计算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) 
                }
        );