假设我有一个来自表的某些列值列表,如何删除空字符串和重复值。请参阅以下代码:
List<string> dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field<string>("column1")).ToList();
这就是我刚刚编写的内容,但是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"));
}
答案 0 :(得分:161)
dtList = dtList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList()
我假设空字符串和空格就像null。如果不是,您可以使用IsNullOrEmpty
(允许空格)或s != null
答案 1 :(得分: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();
返回相同的元素;他们只是排序了。
答案 2 :(得分:1)
Amiram Korach解决方案确实很整洁。为了多功能性,这里有一个替代方案。
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();
答案 3 :(得分:0)