需要时髦的LINQ(第2部分)

时间:2011-11-08 15:45:07

标签: c# .net linq c#-4.0 .net-4.0

我有一个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行3列。每个数据块都有4个元素,所以我需要过滤掉12个元素:29,P,6.74,11.23,07,P,5.25,14.29,08,P,6.89,16.92

之后,下一个元素是2和5,例如2行5列。同样,每个数据块都有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行1列,因此需要4个元素,即111,P,7.26,13.79

指标(例如1,3& 2,5& 1,1)可能不同,因此CSV长度显然会有所不同。在这个例子中,可能还有许多这些指标,而不仅仅是3个。

我已经开始使用Aggregate((x, y) => x * y)方法来计算我们需要的数量,但我的代码不够动态,无法考虑超过3个指标集

有没有办法找到这些指标,然后从CSV字符串中的正确位置返回正确数量的元素?

请注意:我并不仅限于使用LINQ解决方案。我只是觉得可能有内置方法来处理这个问题。

2 个答案:

答案 0 :(得分:0)

嗯,伪代码:

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,因此任何长度输入。

答案 1 :(得分:0)

我咨询过一位同事,并且有一个可行的解决方案,但我对是否可以改进这一点持开放态度:

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