Удалить все пустые записи из общего списка объектов - PullRequest
0 голосов
/ 04 марта 2019

Это должно быть легко, но, похоже, ускользает от меня.

Учитывая эту переменную: (которая содержит ~ 30 записей)

var seriesData = new List<List<object>>();

Как мне пройти по каждой записи,и пропустить любую запись, которая содержит ноль, где-нибудь внутри?

Как правило, каждый список внутри будет выглядеть следующим образом:

["02/16/2019", 5, 7, 10]
["02/17/2019", 3, 15, 2]

и иногда:

["02/18/2019", 5, {null}, 10]

Это то, что я пробовал, но оно не работает:

foreach (List<object> row in seriesData)
{
    if (row.Contains(null)) seriesData.Remove(row);
}

Результат, с которым я заканчиваю, совершенно пустой?

Ответы [ 4 ]

0 голосов
/ 04 марта 2019

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

var nonulls = seriesData.Where(sd => !sd.Any(o => o == null));
0 голосов
/ 04 марта 2019

Без LinQ вы можете сделать что-то вроде этого:

int i = 0;
while (i < seriesData.Count)
{
    if (seriesData[i].Contains(null))
    {
        seriesData.RemoveAt(i);
    } else {
        i++;
    }
}

Это может быть наиболее эффективным решением и не требовать LinQ, если вы его еще не используете.Если, с другой стороны, вы уже используете LinQ, стиль может быть важнее производительности.

В качестве упражнения я пишу версию, которая меняет порядок записей, но имеет меньшую сложность.Как утверждает @Lee, приведенный выше код может иметь сложность O (n ^ 2).Вот еще одна версия, может быть, поможет некоторый бенчмаркинг, если производительность действительно важна:

int i = 0, last;
while (i < seriesData.Count)
{
    if (seriesData[i].Contains(null))
    {
        last = seriesData.Count - 1;
        seriesData[i] = seriesData[last];
        seriesData.RemoveAt(last);
    } else {
        i++;
    }
}
0 голосов
/ 04 марта 2019

Вы можете использовать RemoveAll, который принимает предикат:

seriesData.RemoveAll(row => row.Any(x => x == null))
0 голосов
/ 04 марта 2019

Если вы можете использовать LINQ, это должно быть легко:

seriesData = seriesData
    // filter the lists (x) where all items in them (y) are not null
    .Where(x => x.All(y => y != null))
    // and get the result
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...