J'ai une liste d'objets. Si l'une des propriétés est égale à null , je veux que cet élément entier soit supprimé de la liste. Y a-t-il une meilleure façon de le faire que ce que j'ai ci-dessous.
J'ai essayé les boucles for et pour chacune et je ne sais pas comment le faire ou je ne comprends pas complètement comment accomplir ma tâche. / p>
List<Order> orders = new List<Order>
{
new Order {ColumnName = null, OperantOrder = null},
new Order {ColumnName = Session, OperantOrder = ASC},
new Order {ColumnName = null, OperantOrder = null},
}
Donc, si j'ai la liste ci-dessous:
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++;
}
}
Je veux que la liste ne contienne que l'élément 1 où columnName = session et ordre opérant = asc.
3 Réponses :
Une approche plus idiomatique consisterait à utiliser RemoveAll :
filterCriterias.RemoveAll(c => c.ColumnName == null ||
c.Comparator == null ||
c.Criteria == null);
Merci pour la modification, E. Moffat. Faute de frappe stupide de ma part :-(
Il n'est pas nécessaire de supprimer, sélectionnez simplement ce que vous voulez en utilisant System.Linq comme ci-dessous. Cela renverra une nouvelle collection.
var order = orders.FirstOrDefault(x => x.ColumnName == Session && x.OperantOrder == ASC);
Vous pouvez également envisager d'utiliser FirstOrDefault () comme
var order = orders.Where(x => x.ColumnName == Session && x.OperantOrder == ASC).ToList();
p >
Cela créerait une autre liste. Selon ce que l'OP entend par «mieux», cela pourrait être «pire».
Pour utiliser une boucle for lors de la suppression d'éléments d'une liste, il est normalement préférable de commencer au dernier élément et de travailler en arrière. De cette façon, vous ne finissez pas par sauter des éléments ou obtenir une exception IndexOutOfRange car le Count a changé pendant la boucle (ce qui se produit lors de la suppression d'éléments dans une direction avant):
// 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);
}
}
Si vous allez utiliser cette méthode, vous devriez vraiment parcourir la liste à l'envers, sinon vous pourriez finir par sauter des éléments / dépasser la fin de la liste.