как удалить пустые строки из списка, а затем удалить повторяющиеся значения из списка



допустим, у меня есть список некоторых значений столбцов, поступающих из таблицы, Как удалить пустые строки и повторяющиеся значения. Пожалуйста, смотрите следующий код:



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


}
486   3  

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

    Ничего не найдено.