Есть ли лучший способ удалить элементы из списка с помощью c #? - PullRequest
3 голосов
/ 29 марта 2019

У меня есть список объектов.Если какое-либо из свойств равно null, я хочу удалить весь этот элемент из списка.Есть ли лучший способ сделать это, чем то, что у меня ниже.

Я пробовал петли и для каждого и либо не могу понять, как это сделать, либо не до конца понимаю, как это сделать.task.

var i = 0;

while (i < filterCriterias.Count())
{
    if (filterCriterias[i].ColumnName == null 
        || filterCriterias[i].Comparator == null 
        || filterCriterias[i].Criteria == null)
    {
        filterCriterias.RemoveAt(i);
    }
    else
    {
        i++;
    }
}

Так что, если у меня есть список ниже:

List<Order> orders = new List<Order> 
{
    new Order {ColumnName = null, OperantOrder = null},
    new Order {ColumnName = Session, OperantOrder = ASC},
    new Order {ColumnName = null, OperantOrder = null},
}

Я только хочу, чтобы список содержал только элемент 1, где columnName = session и operantorder = asc.

Ответы [ 3 ]

10 голосов
/ 29 марта 2019

Более идиоматическим подходом было бы использование RemoveAll:

filterCriterias.RemoveAll(c => c.ColumnName == null ||
                               c.Comparator == null ||
                               c.Criteria == null);
1 голос
/ 29 марта 2019

Чтобы использовать цикл for при удалении элементов из списка, обычно лучше начинать с последнего элемента и работать в обратном направлении.Таким образом, вы не пропустите элементы или не получите исключение IndexOutOfRange, поскольку Count изменилось во время цикла (что происходит при удалении элементов в прямом направлении):

// Start at the last index and move towards index '0'
for (int i = filterCriterias.Count - 1; i >= 0; i--)
{
    if (filterCriterias[i].ColumnName == null ||
        filterCriterias[i].Comparator == null ||
        filterCriterias[i].Criteria == null)
    {
        filterCriterias.RemoveAt(i);
    }
}
1 голос
/ 29 марта 2019

Нет необходимости удалять, просто выберите то, что вы хотите, используя System.Linq, как показано ниже.Это вернет новую коллекцию.

var order = orders.Where(x => x.ColumnName == Session && x.OperantOrder == ASC).ToList(); 

Вы также можете рассмотреть возможность использования FirstOrDefault() как

var order = orders.FirstOrDefault(x => x.ColumnName == Session && x.OperantOrder == ASC); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...