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"));
}
Antworten:
dtList = dtList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList()
Ich nahm an, dass leere Zeichenfolgen und Leerzeichen wie null sind. Wenn nicht, können Sie
IsNullOrEmpty
(Leerzeichen zulassen) oder verwendens != null
quelle
Distinct
es nicht ermöglichen, sie zu optimieren?Amirams Antwort ist richtig, aber Distinct () wie implementiert ist ein N. 2 -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 dedupiert werden. Wenn das aktuelle Element dem vorherigen Element entspricht, ignorieren Sie es, andernfalls geben Sie es zurück. Das Sortieren ist NlogN. Selbst wenn wir die Sammlung sortieren müssen, erhalten wir einige Vorteile:
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 die gleichen Elemente zurück; Sie sind nur sortiert.
quelle
Distinct
verwendet Hashing und sollte näher an O (N) als an O (N ^ 2) liegen. QuelleAmiram Korach Lösung ist in der Tat ordentlich. Hier ist eine Alternative aus Gründen der 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();
quelle
Um die Lösung von Amiram Korach zu vereinfachen :
dtList.RemoveAll(s => string.IsNullOrWhiteSpace(s))
Sie müssen weder Distinct () noch ToList () verwenden.
quelle