Funky LINQ Required (Part 2)
本文关键字:Part LINQ Required Funky | 更新日期: 2023-09-27 18:14:03
我有一个CSV字符串:
string data = "G9999999990001800002777107050,G9999999990002777107HMNLAQKPRLLHRAQRWJ010,1,3,29,P,6.74,11.23,07,P,5.25,14.29,08,P,6.89,16.92,2,5,052,U,4.78,31.04,095,O,9.59,27.63,076,P,3.85,16.50,094,P,4.84,18.30,093,O,8.28,26.90,062,P,4.64,16.00,061,P,2.84,12.87,090,O,7.90,20.83,050,P,3.36,16.59,057,B,12.05,34.46,1,1,111,P,7.26,13.79";
前两个元素是ID。
第二个2表示行和列,例如1 row 3 Columns。每个数据块有4个元素,所以我需要过滤出12个元素,它们是:29,P,6.74,11.23,07,P,5.25,14.29,08,P,6.89,16.92
之后的元素是2和5,例如2 Rows 5 Columns。同样,每个数据块有4个元素所以我需要40个元素这将导致052,U,4.78,31.04,095,O,9.59,27.63,076,P,3.85,16.50,094,P,4.84,18.30,093,O,8.28,26.90,062,P,4.64,16.00,061,P,2.84,12.87,090,O,7.90,20.83,050,P,3.36,16.59,057,B,12.05,34.46
下一个元素是1,1,例如1 Row 1 Column,所以取4个元素,即111,P,7.26,13.79
指标(如1,3 &2、5,(1,1)可以是不同的,所以显然CSV的长度是不同的。在这个例子中,这些指示符可能有很多组,而不仅仅是3组。
我已经开始使用Aggregate((x, y) => x * y)
方法来计算我们需要多少,但我的代码不够动态,不能考虑超过3个指标集
是否有办法找到这些指标,然后从CSV字符串的正确位置返回元素的正确数量?
请注意:我并没有限制自己只使用LINQ解决方案。我只是想也许有内置的方法来处理这个
hmm,伪代码:
read first two IDs
int c = position of second comma
while c <= length of string
int x = parse number after c
int y = parse number after x
set c = position of y + 1
int[][] m = new int[x][y]
for (i=0; i<x; i++)
for (j=0; j<y; j++)
m[i][j] = parse 4 elements after c
move c to end of m[i][j]
add m to list of results
我猜你想把元素存储在一个矩阵中,你想要一个矩阵列表的结果,但这涵盖了任何数量的对x,y
,因此任何长度的输入。
我已经咨询了一位同事,并有了一个可行的解决方案,但我对是否可以改进持开放态度:
public class Data
{
public string Index { get; set; }
public string Letter { get; set; }
}
string data = "G9999999990001800002777107050,G9999999990002777107HMNLAQKPRLLHRAQRWJ010,1,3,29,P,6.74,11.23,07,P,5.25,14.29,08,P,6.89,16.92,2,5,052,U,4.78,31.04,095,O,9.59,27.63,076,P,3.85,16.50,094,P,4.84,18.30,093,O,8.28,26.90,062,P,4.64,16.00,061,P,2.84,12.87,090,O,7.90,20.83,050,P,3.36,16.59,057,B,12.05,34.46,1,1,111,P,7.26,13.79";
var elements = data.Split(',');
int counter = 1;
int startIndex = 2;
int dataBlock=0;
Dictionary<int, List<Data>> result = new Dictionary<int,List<Data>>();
while(elements.Length > startIndex)
{
dataBlock = int.Parse(elements[startIndex]) * int.Parse(elements[startIndex+1]);
startIndex +=2;
for(int i=0;i<dataBlock;i++)
{
Data d = new Data(){Index = elements[startIndex], Letter = elements[startIndex+1]};
if (result.ContainsKey(counter))
result[counter].Add(d);
else
{
result.Add(counter, new List<Data>());
result[counter].Add(d);
}
startIndex+=4;
}
counter++;
}