我有一个行列表:
public class Row
{
public string SINo{ get; set; }
public string AccountName { get; set; }
public string ProductCode { get; set; }
public int Quantity { get; set; }
public int FreeGoods { get; set; }
...
}
和这些记录:
SINo AccountName ProductCode Quantity FreeGoods
S145144 DUMAN, MARILYN M. 13002154 8
S145144 DUMAN, MARILYN M. 13002154 2
S144413 CRUZ, ISABELLA 13002154 2
S145151 CASTRO, MARIO C. 13002154 5
S145151 CASTRO, MARIO C. 13002154 1
S142058 RILLERA, FREDILYN B. 13002155 10
S142058 RILLERA, FREDILYN B. 13002155 2
如您所见,原始订单的下一行具有相同的记录但数量不同。这意味着数量另一行是FreeGoods。但是在其他一些行中,可能会有记录没有FreeGoods的成功记录。我对linq不太了解。我如何分组并选择它来制作这样的东西?
SINo AccountName ProductCode Quantity FreeGoods
S145144 DUMAN, MARILYN M. 13002154 8 2
S144413 CRUZ, ISABELLA 13002154 2
S145151 CASTRO, MARIO C. 13002154 5 1
S142058 RILLERA, FREDILYN B. 13002155 10 2
每条记录中没有唯一属性。例如,属性SINo,AccountName,产品可以在每一行中重复。
答案 0 :(得分:0)
我建议您添加一个新列hasFreeGoods,因为它将为您提供更清晰的解决方案
关于当前结构。我假设每个产品最多有两条记录
var groups=from r in Rows group r by new {
r.ProductCode,
r.SINo,
r.AccountName
} into gr;
groups.select(g => new {
g.Key.ProductCode,
g.Key.SINo,
g.Key.AccountName,
Quantity=g.First().Quantity,
FreeGoods =g.Count()>1 ? g.Last().Quentity :0
})
答案 1 :(得分:0)
按照Linq查询给出我预期的结果。希望它会帮助你
List<Row> list = new List<Row>();
//add data to list
//then execute this linq query
list.GroupBy(x => x.SINo).Select(y=> new Row
{
AccountName = y.First().AccountName,
ProductCode = y.First().ProductCode,
Quantity = y.First().Quantity,
SINo = y.First().SINo,
FreeGoods = y.Count() > 1 ? y.Last().Quantity : 0
});
答案 2 :(得分:0)
你可以试试这个。与之前的答案略有不同:
var result = list.GroupBy(p => p.SINo,
(key, g) => new {
SINo = g.Key,
ProductCode = g.First().ProductCode,
AccountName = g.First().AccountName,
Quantity = g.First().Quantity,
FreeGoods = g.Count() > 1 ? g.Last().Quantity : 0
}).ToList();