我在文本文件中有一个购物清单,如下所示:
BuyerId Item;
1; Item1;
1; Item2;
1; ItemN;
2; Item1;
2; ItemN;
3; ItemN;
我需要将此列表转换为如下格式:
Item1; Item2; Item3; ...; ItemN <--- For buyer 1
Item1; ...; ItemN <--- For buyer 2
Item1; ...; ItemN <--- For buyer 3
首先,我像这样解析 CSV 文件:
IList<string[]> parsedcsv = (from line in lines.Skip(1)
let parsedLine = line.TrimEnd(';').Split(';')
select parsedLine).ToList();
然后我用 LINQ 对这些项目进行分组并将它们聚合为最终格式:
IEnumerable<string> buyers = from entry in parsedcsv
group entry by entry[0] into cart
select cart.SelectMany(c => c.Skip(1))
.Aggregate((item1, item2) =>
item1 + ";" + item2).Trim();
但是,碰巧,BuyerId 不是唯一的,而是在多次重复后重复(例如,它可以像这样重复:1,2,3,4,5,1,2,3,4,5,1 ,2,3 或类似的 1,2,3,1,2,3,1,2)。
没什么大不了的,我可以很容易地解决这个问题,方法是将项目分组在一个循环中,检查我一次只与一个买家打交道:
int lastBatchId = 0;
string currentId = parsedcsv[0][0];
for (int i = 0; i < parsedcsv.Count; i++)
{
bool last = parsedcsv.Count - 1 == i;
if (parsedcsv[i][0] != currentId || last)
{
IEnumerable<string> buyers = from entry in parsedcsv.Skip(lastBatchId)
.Take(i - lastBatchId + (last ? 1 : 0))
...
lastBatchId = i;
currentId = parsedcsv[i][0];
...
...但是,这不是最优雅的解决方案。我几乎可以肯定这只能用 LINQ 来完成。
有人可以帮我吗?
谢谢!