Требуется фанки LINQ (часть 2) - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть строка 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";

Первые 2 элемента являются идентификаторами.

Вторые 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 голосов
/ 08 ноября 2011

Я проконсультировался с коллегой и у меня есть рабочее решение, но я открыт для того, чтобы улучшить его:

 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++;
            }
0 голосов
/ 08 ноября 2011

хмм, псевдокод:

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 и, следовательно, любой длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...