如何从列表中删除空string,然后从列表中删除重复的值

比方说,我有一个来自表的列值的列表,我如何删除空string和重复的值。 请看下面的代码:

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

这就是我刚刚编写的代码,但是Amiram的代码更加优雅,所以我会select这个答案是我做的:

 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")); } 
 dtList = dtList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList() 

我假定空string和空格是空的。 如果不是,你可以使用IsNullOrEmpty (允许空格)或s != null

Amiram的答案是正确的,但是Distinct()是一个N 2操作; 对于列表中的每个项目,algorithm将其与所有已处理的元素进行比较,如果它是唯一的,则将其返回,否则将其忽略。 我们可以做得更好。

一个sorting的列表可以在线性时间内被删除; 如果当前元素等于之前的元素,则忽略它,否则返回它。 sorting是NlogN,所以即使sorting收集,我们也得到了一些好处:

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

这返回相同的元素; 他们只是sorting。

Amiram Korach解决scheme确实很整洁。 这是为了多function性的一个select。

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