次のようなテキストファイルにショッピングリストがあります。
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)。
大したことではありません。一度に1人の購入者のみと取引することを確認するループにアイテムをグループ化することで、これを非常に簡単に修正できます。
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でのみ実行できるとほぼ確信しています。
誰かがここで私を助けてくれますか?
ありがとう!