c # - объединение двух списков <string>с использованием отметки времени в списке - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть два списка, которые содержат данные журналов (списки содержат строки).
Пример list1 будет выглядеть следующим образом (каждая запись является строкой):
11:03:01:003 INFO some event has occurred 11:03:31:004 DEBUG another event has occurred 11:04:01:015 INFO third event has occurred
Пример list2 будет выглядеть следующим образом:
11:03:16:003 INFO fourth event has occurred 11:03:32:025 DEBUG fifth event has occurred 11:03:54:023 INFO sixth event has occurred

Моя цель - создать список3, который будет выглядеть следующим образом:
11:03:01:003 INFO some event has occurred 11:03:16:003 INFO fourth event has occurred 11:03:31:004 DEBUG another event has occurred 11:03:32:025 DEBUG fifth event has occurred 11:03:54:023 INFO sixth event has occurred 11:04:01:015 INFO third event has occurred

Я думал об эффективном способе решения этой проблемы (поскольку файлы журнала могут быть довольно тяжелыми), но на самом деле не смог понять это.

Редактировать : Списки поступают из файлов ".txt" и разделяются по определенной характеристике, поэтому мне может понадобиться объединить даже более двух списков, но первый шаг, который я должен был сделать, был генерировать те списки, которые я смог сделать.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Если каждый список упорядочен, наиболее эффективным способом является объединение (O(m + n), где m и n - длины списков), как в алгоритме сортировки слиянием:

var result = new List<string>(m+n);
int i = 0, j = 0;
while (i < l1.Count && j < l2.Count) {
    if (l1[i] < l2[j]) { // Of course you have to change this part, the idea is to compare both items
        result.Add(l1[i++]);
    } else {
        result.Add(l2[j++]);
    }
}

while(i < l1.Count) { result.Add(l1[i++]); }
while(j < l2.Count) { result.Add(l2[j++]); }
0 голосов
/ 09 ноября 2018

Вы можете использовать LINQ для этого, сначала получая время, а затем заказывая:

var result = list
    .Select(x => 
    { 
        return new { Log = x, Time = TimeSpan.Parse(x.Split(' ')[0]) }; 
    })
    .OrderBy(x => x.Time)
    .Select(x => x.Log) // only if you don't care anymore about the time
    .ToArray();

Например, что-то вроде этого:

var list = new List<string>();
list.Add("11:03:01:003 INFO some event has occurred");
list.Add("11:03:31:004 DEBUG another event has occurred");
list.Add("11:04:01:015 INFO third event has occurred");

var list2 = new List<string>();
list2.Add("11:03:16:003 INFO fourth event has occurred");
list2.Add("11:03:32:025 DEBUG fifth event has occurred");
list2.Add("11:03:54:023 INFO sixth event has occurred");

var result = list
    // Merge both lists
    .Union(list2)
    .Select(x => 
    { 
        return new { Log = x, Time = TimeSpan.Parse(x.Split(' ')[0]) }; 
    })
    .OrderBy(x => x.Time)
    .ToArray();

foreach (var log in result)
{
    Console.WriteLine(log.Time + " => " + log.Log);
}

Какие отпечатки:

11.03:01:03 => 11:03:01:003 INFO some event has occurred
11.03:16:03 => 11:03:16:003 INFO fourth event has occurred
11.03:31:04 => 11:03:31:004 DEBUG another event has occurred
11.03:32:25 => 11:03:32:025 DEBUG fifth event has occurred
11.03:54:23 => 11:03:54:023 INFO sixth event has occurred
11.04:01:15 => 11:04:01:015 INFO third event has occurred

Как вы можете видеть в этой скрипке .

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