c # Linq или код для извлечения групп из единого списка исходных данных - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть данные в списке, поступающем от сторонней библиотеки dll. Я не могу изменить способ получения данных. Это список, как этот непрерывный и непрерывный без разделителей

List<MyType> DataList

С каждой строкой связан индексный номер. Индексные числа могут быть от 1 до 4, максимальное число 4. Таким образом, в оптимальном случае мы будем видеть группы строк, пронумерованные от 1 до 4, одну группу за другой. Но в группах может отсутствовать индекс.

Как вы можете видеть здесь, первая группа имеет 1-4, вторая группа имеет 1,2,4 (отсутствует 3), а третья группа имеет 1,2,3 (отсутствует 4), а также строки могут быть вставлены, поэтому индексы расположены не в любом порядке

Пробелы в строках, которые вы видите здесь, я вставил только для ясности

    Filename    Index   Time                
    File_1      1       42038.6924500000    
    File_2      2       42038.6435300000    
    File_3      3       42038.7962800000    
    File_4      4       42038.9340600000    

    File_5      2       42938.9561300000    
    File_6      1       42939.0110700000    
    File_7      4       42939.5551700000    

    File_8      2       43838.9652200000    
    File_9      1       43839.0111500000    
    File_10     3       43839.0990100000    

Мне нужно извлечь из этого списка 4 отдельные группы на основе номера индекса. Таким образом, каждая группа состоит из всего индекса 1 или всего индекса 2 и т. Д. но там, где отсутствует индекс, мне нужно вставить строку заполнения пробела, чтобы указать отсутствующий индекс.

Например, вышеприведенное должно закончиться как

group on index 1
File_1      1       42038.6924500000    
File_6      1       42939.0110700000  
File_9      1       43839.0111500000    

group 2 on index 2
File_2      2       42038.6435300000    
File_5      2       42938.9561300000 
File_8      2       43838.9652200000    

group 3 on index 3
File_3      3       42038.7962800000    
File_spacer 3       00000.0000000000
File_10     3       43839.0990100000   

group 4 on index 4
File_4      4       42038.9340600000
File_7      4       42939.5551700000 
File_spacer 4       00000.0000000000

Так что я мог бы сделать Linq

DataList.GroupBy(x => X.Index)).ToList()

но это не вставит нужную мне запись File_spacer Index 0000.000000000, чтобы заменить отсутствующий индекс в качестве заполнителя.

Список обычно может содержать 500 строк данных таким образом, но я не могу придумать код c # для извлечения и форматирования по мере необходимости.

Любые предложения приветствуются

1 Ответ

1 голос
/ 07 апреля 2019

Попробуйте следующее:

double tickPerDay = (double)(24.0 * 60.0 * 60.0 * 10000000.0);
List<MyType> DataList = new List<MyType>() {
    new MyType() { Filename = "File_1", Index = 1, Time = (DateTime.Parse("1/1/1900").AddDays(42038)).AddTicks((long)(tickPerDay * .6924500000))},
    new MyType() { Filename = "File_2", Index = 2, Time = (DateTime.Parse("1/1/1900").AddDays(42038)).AddTicks((long)(tickPerDay * .6435300000))},
    new MyType() { Filename = "File_3", Index = 3, Time = (DateTime.Parse("1/1/1900").AddDays(42038)).AddTicks((long)(tickPerDay * .7962800000))},
    new MyType() { Filename = "File_4", Index = 4, Time = (DateTime.Parse("1/1/1900").AddDays(42038)).AddTicks((long)(tickPerDay * .9340600000))},
    new MyType() { Filename = "File_5", Index = 2, Time = (DateTime.Parse("1/1/1900").AddDays(42038)).AddTicks((long)(tickPerDay * .9561300000))},
    new MyType() { Filename = "File_6", Index = 1, Time = (DateTime.Parse("1/1/1900").AddDays(42039)).AddTicks((long)(tickPerDay * .9561300000))},
    new MyType() { Filename = "File_7", Index = 4, Time = (DateTime.Parse("1/1/1900").AddDays(42039)).AddTicks((long)(tickPerDay * .5551700000))},
    new MyType() { Filename = "File_8", Index = 2, Time = (DateTime.Parse("1/1/1900").AddDays(42038)).AddTicks((long)(tickPerDay * .9652200000))},
    new MyType() { Filename = "File_9", Index = 1, Time = (DateTime.Parse("1/1/1900").AddDays(42039)).AddTicks((long)(tickPerDay * .0111500000))},
    new MyType() { Filename = "File_10", Index = 3, Time = (DateTime.Parse("1/1/1900").AddDays(42039)).AddTicks((long)(tickPerDay * .0990100000))}
    };

int maxIndex = DataList.Max(x => x.Index);

var results = DataList.GroupBy(x => x.Index)
    .Select(x => Enumerable.Range(1, maxIndex)
        .Select(y => x.Any(z => z.Index == y) ? x.Where(z => z.Index == y).FirstOrDefault() : new MyType() { Filename = "File_spacer", Index = y, Time = DateTime.Parse("1/1/1900")})
        .ToList())
    .ToList();  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...