Подтвердить что ты не робот

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

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

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


       }
4b9b3361

Ответ 1

dtList  = dtList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList()

Я предположил, что пустая строка и пробельные символы равны нулю. Если вы не можете использовать IsNullOrEmpty (разрешить пробел) или s != null

Ответ 2

Ответ 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();

Это возвращает те же элементы; они просто отсортированы.

Ответ 3

Решение 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();