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

Dev*_*per 71 c# linq coding-style

假设我有一个来自表的列值的列表,如何删除空字符串和重复值.请参阅以下代码:

List<string> dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field<string>("column1")).ToList();
Run Code Online (Sandbox Code Playgroud)

这就是我刚刚编写的内容,但是Amiram的代码更优雅,所以我会选择答案就是这样做:

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


       }
Run Code Online (Sandbox Code Playgroud)

Ami*_*ach 182

dtList  = dtList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList()
Run Code Online (Sandbox Code Playgroud)

我假设空字符串和空格就像null.如果没有,你可以使用IsNullOrEmpty(允许空格),或s != null


小智 14

为了简化Amiram Korach 的解决方案:

dtList.RemoveAll(s => string.IsNullOrWhiteSpace(s))
Run Code Online (Sandbox Code Playgroud)

无需使用 Distinct() 或 ToList()

  • 为了简化@Bojan的解决方案:`dtList.RemoveAll(string.IsNullOrWhiteSpace)`:D (7认同)

Kei*_*thS 7

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

排序列表可以在线性时间内重复数据删除; 如果当前元素等于前一个元素,则忽略它,否则返回它.排序是NlogN,所以即使必须对集合进行排序,我们也会获得一些好处:

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();
Run Code Online (Sandbox Code Playgroud)

这返回相同的元素; 他们只是排序.

  • `Distinct` 使用散列,应该比 O(N^2) 更接近 O(N)。[来源](http://stackoverflow.com/a/2799543/480799) (2认同)