gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:15:04 25 4
gpt4 key购买 nike

我编写了一个测试用例:

我有一张这样的 table

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

关于c# - 从 foreach 中编辑属性不会影响集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39296950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com