it-swarm.com.de

So entfernen Sie leere Zeichenfolgen aus der Liste und anschließend doppelte Werte aus einer Liste

Nehmen wir an, ich habe eine Liste einiger Spaltenwerte aus einer Tabelle. Wie entferne ich leere Zeichenfolgen und doppelte Werte? Bitte beachten Sie den folgenden Code:

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

Dies ist, was ich gerade codiert habe, aber Amirams Code ist viel eleganter, also werde ich diese Antwort hier so wählen, wie ich es gemacht habe:

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()

Ich nahm an, dass leere Zeichenfolge und Leerzeichen wie null sind. Andernfalls können Sie IsNullOrEmpty (Leerzeichen zulassen) oder s != null

169
Amiram Korach

Amirams Antwort ist richtig, aber Distinct () ist wie implementiert ein N2 Operation; Für jedes Element in der Liste vergleicht der Algorithmus es mit allen bereits verarbeiteten Elementen und gibt es zurück, wenn es eindeutig ist, oder ignoriert es, wenn nicht. Wir können es besser machen.

Eine sortierte Liste kann in linearer Zeit abgeleitet werden; Wenn das aktuelle Element dem vorherigen Element entspricht, ignorieren Sie es, andernfalls geben Sie es zurück. Die Sortierung ist NlogN, so dass wir, selbst wenn wir die Sammlung sortieren müssen, einige Vorteile haben:

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();

Dies gibt dieselben Elemente zurück. Sie sind nur sortiert.

7
KeithS

Amiram Korach Lösung ist in der Tat ordentlich. Hier ist eine Alternative für die Vielseitigkeit.

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