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解决方案。我只是想也许有内置的方法来处理这个

Funky LINQ Required (Part 2)

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++;
            }