我有这个实体
public class Counter
{
public int DocEntry { get; set; }
public int LineId { get; set; }
public string Item { get; set; }
public decimal Quantity { get; set; }
public string FromWarehouse { get; set; }
public string ToWarehouse { get; set; }
public virtual List<Batch> batchs { get; set; }
}
public class Batch
{
public string BatchNumber { get; set; }
public decimal Quantity { get; set; }
}
我有列表计数,我应该基于Item值,FromWarehouse,ToWarehouse对列表中的元素进行分组,并且应该将结果与合计数量分组,然后合并批次列表,我尝试使用foreach方法,并在新列表中插入第一个元素,如果当前行反映了列表中已有元素的值,则在后续迭代中,我汇总数量并将第i个元素的Batch列表元素添加到Batch列表中-第一行,否则我添加了新行,这种方法似乎太复杂了,对linq并不是很熟练,或者在任何情况下是否有更简单的方法来管理组?
这是我的方法:
public static List<Counter> GroupBy(List<Counter> list)
{
List<Counter> rows = new List<Counter>();
int i = 0;
foreach (Counter elem in list)
{
if (list.First() == elem)
{
rows.Add(elem);
i++;
}
else
{
if (elem.Item == rows.ElementAt(i).Item &&
elem.FromWarehouse == rows.ElementAt(i).FromWarehouse &&
elem.ToWarehouse == rows.ElementAt(i).ToWarehouse)
{
rows.First().Quantity += elem.Quantity;
rows.First().batchs.Add(elem.batchs.First());
}
else
{
rows.Add(elem);
i++;
}
}
}
return rows;
}
这是解决方案:
public static List<Counter> GroupBy(List<Counter> list)
{
List<Counter> rows = new List<Counter>();
foreach (Counter elem in list)
{
if (rows.Any(x=>x.Item == elem.Item &&
x.FromWarehouse == elem.FromWarehouse &&
x.ToWarehouse == elem.ToWarehouse))
{
rows.First().Quantity += elem.Quantity;
rows.First().batchs.Add(elem.batchs.First());
}
else
{
rows.Add(elem);
}
}
return rows;
}
答案 0 :(得分:0)
让我们尝试逐步编写 Linq 。
“我有列表count
”:
List<Counter> count = ...
“我应该根据Item
值FromWarehouse
,ToWarehouse
对列表中的元素进行分组”:
var result = count
.GroupBy(item => new {
item.Item,
item.FromWarehouse
item.ToWarehouse
})
“ result
应该与 summer quantity
和Batch
merged 的列表分组,即您应该{{ 1}}个项目在每个 Aggregate
chunk
最后,让我们以更方便(可读)的格式表示 var result = count
.GroupBy(item => new {
item.Item,
item.FromWarehouse
item.ToWarehouse
})
.Select(chunk => new {
key = chunk.Key,
summary = chunk.Aggregate(
Tuple.Create(0m, new List<Batch>()), // initial empty
(s, a) => Tuple.Create(s.Item1 + a.Quantity, // add
s.Item2.Concat(a.batchs).ToList()) // merge
})
:
result