有没有更好的方法使用c#从列表中删除元素?

时间:2019-03-29 18:42:23

标签: c# list

我有一个对象列表。如果任何属性等于null,我希望将整个元素从列表中删除。有没有比我下面的方法更好的方法了。

我已经尝试了每个循环,但要么不知道该怎么做,要么不完全了解如何完成任务。

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 =会话,operantorder = asc。

3 个答案:

答案 0 :(得分:10)

更惯用的方法是使用RemoveAll

var obj = {
    "set1": [1, 2, 3],
    "set2": [4, 5, 6, 7, 8],
    "set3": [9, 10, 11, 12]
};

jQuery.each(obj, function(i, val) {
	console.log(i); // "set1"
	console.log(val); // [1, 2, 3]
});

答案 1 :(得分:1)

无需使用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); 

答案 2 :(得分:1)

要从列表中删除项目时使用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);
    }
}