web-dev-qa-db-fra.com

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 colonne provenant d'une table, comment puis-je supprimer les chaînes vides et les valeurs en double. S'il vous plaît voir le code suivant:

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

C’est ce que j’ai codé tout à l’heure, mais le code d’Amiram est bien plus élégant. Je vais donc choisir la réponse suivante:

DataTable dtReportsList = someclass.GetReportsList();

        if (dtReportsList.Rows.Count > 0)
       { 


           List<string> dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field<string>("column1")).ToList();
           dtList.RemoveAll(x=>x == "");
           dtList = dtList.Distinct().ToList();         

           rcboModule.DataSource = dtList;
           rcboModule.DataBind();               
           rcboModule.Items.Insert(0, new RadComboBoxItem("All", "All"));


       }
69
Developer
dtList  = dtList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList()

J'ai supposé que les chaînes vides et les espaces sont comme nuls. Sinon, vous pouvez utiliser IsNullOrEmpty (autoriser les espaces) ou s != null

169
Amiram Korach

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

Une liste triée peut être déduite en temps linéaire; si l'élément en cours est égal à l'élément précédent, ignorez-le, sinon renvoyez-le. Le tri est NlogN, alors même le tri de la collection procure un avantage:

public static IEnumerable<T> SortAndDedupe<T>(this IEnumerable<T> 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 => !string.IsNullOrWhitespace(s)).SortAndDedupe().ToList();

Cela retourne les mêmes éléments. ils sont juste triés.

7
KeithS

La solution Amiram Korach est bien rangée. Voici une alternative pour plus de polyvalence.

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