Comment supprimer des chaînes vides de la liste, puis supprimer les valeurs en double d’une liste

Disons que j’ai une liste de certaines valeurs de colonnes provenant d’une table, comment supprimer les chaînes vides et les valeurs en double. S’il vous plaît voir le code suivant:

List dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field("column1")).ToList(); 

C’est ce que j’ai codé tout à l’heure, mais le code d’Amiram est beaucoup plus élégant, alors je choisirai cette réponse comme suit:

 DataTable dtReportsList = someclass.GetReportsList(); if (dtReportsList.Rows.Count > 0) { List dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field("column1")).ToList(); dtList.RemoveAll(x=>x == ""); dtList = dtList.Distinct().ToList(); rcboModule.DataSource = dtList; rcboModule.DataBind(); rcboModule.Items.Insert(0, new RadComboBoxItem("All", "All")); } 

 dtList = dtList.Where(s => !ssortingng.IsNullOrWhiteSpace(s)).Distinct().ToList() 

J’ai supposé que la chaîne vide et les espaces sont comme null. Sinon, vous pouvez utiliser IsNullOrEmpty (permettre les espaces blancs) ou s != null

La réponse d’Amiram est correcte, mais Distinct () tel qu’il est implémenté est une opération N 2 ; pour chaque élément de la liste, l’algorithme le compare à tous les éléments déjà traités et le retourne s’il est unique ou l’ignore sinon. Nous pouvons faire mieux.

Une liste sortingée peut être déduite en temps linéaire; Si l’élément actuel est égal à l’élément précédent, ignorez-le, sinon retournez-le. Le sorting est NlogN, donc même en ayant à sortinger la collection, nous obtenons certains avantages:

 public static IEnumerable SortAndDedupe(this IEnumerable input) { var toDedupe = input.OrderBy(x=>x); T prev; foreach(var element in toDedupe) { if(element == prev) continue; yield return element; prev = element; } } //Usage dtList = dtList.Where(s => !ssortingng.IsNullOrWhitespace(s)).SortAndDedupe().ToList(); 

Cela renvoie les mêmes éléments; ils sont juste sortingés

Amiram Korach solution est en effet ordonnée. Voici une alternative pour la polyvalence.

 var count = dtList.Count; // Perform a reverse tracking. for (var i = count - 1; i > -1; i--) { if (dtList[i]==ssortingng.Empty) dtList.RemoveAt(i); } // Keep only the unique list items. dtList = dtList.Distinct().ToList();