как удалить пустые строки из списка, а затем удалить повторяющиеся значения из списка
допустим, у меня есть список некоторых значений столбцов, поступающих из таблицы, Как удалить пустые строки и повторяющиеся значения. Пожалуйста, смотрите следующий код:
List<string> dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field<string>("column1")).ToList();
это то, что я только что закодировал, но код Амирама намного элегантнее, поэтому я выберу этот ответ вот как я это сделал:
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"));
}
3 ответов:
dtList = dtList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList()я предположил, что пустая строка и пробелы похожи на null. Если нет, вы можете использовать
IsNullOrEmpty(разрешить пробелы), илиs != null
ответ Амирама правильный, но Distinct() как реализовано-это N2 операция; для каждого элемента в списке алгоритм сравнивает его со всеми уже обработанными элементами и возвращает его, если он уникален, или игнорирует его, если нет. Мы можем сделать лучше.
A отсортированный список может быть дедуплицирован в линейном времени; если текущий элемент равен предыдущему элементу, игнорировать его, в противном случае вернуть его. Сортировка-это 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();Это возвращает те же элементы; они просто отсортированы.
решение Амирама Корача действительно аккуратно. Вот альтернатива ради универсальности.
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();
Comments