Выберите различные значения из большого столбца DataTable

У меня есть DataTable с 22 столбцами, и один из столбцов, которые у меня есть, называется "id". Я хотел бы запросить этот столбец и сохранить все отдельные значения в списке. Таблица может иметь от 10 до миллионов строк.

Каков наилучший способ сделать это? В настоящее время я использую цикл for, чтобы идти по столбцу и сравнивать значения, и если значения одинаковы, то он переходит к следующему, а когда не то же самое, он добавляет id в массив. Но поскольку таблица может иметь от 10 до миллиона строк, есть более эффективный способ сделать это! Как я могу сделать это более эффективно?

Ответы

Ответ 1

Метод 1:

   DataView view = new DataView(table);
   DataTable distinctValues = view.ToTable(true, "id");

Способ 2: Вам нужно будет создать класс, соответствующий вашим именам столбцов данных, а затем вы можете использовать следующий метод расширения для преобразования Datatable в List

    public static List<T> ToList<T>(this DataTable table) where T : new()
    {
        List<PropertyInfo> properties = typeof(T).GetProperties().ToList();
        List<T> result = new List<T>();

        foreach (var row in table.Rows)
        {
            var item = CreateItemFromRow<T>((DataRow)row, properties);
            result.Add(item);
        }

        return result;
    }

    private static T CreateItemFromRow<T>(DataRow row, List<PropertyInfo> properties) where T : new()
    {
        T item = new T();
        foreach (var property in properties)
        {
            if (row.Table.Columns.Contains(property.Name))
            {
                if (row[property.Name] != DBNull.Value)
                    property.SetValue(item, row[property.Name], null);
            }
        }
        return item;
    }

а затем вы можете получить отличный от списка, используя

      YourList.Select(x => x.Id).Distinct();

Обратите внимание, что это вернет вам полные записи, а не только идентификаторы.

Ответ 2

Это приведет к выделению различных идентификаторов

 var distinctIds = datatable.AsEnumerable()
                    .Select(s=> new {
                        id = s.Field<string>("id"),                           
                     })
                    .Distinct().ToList();

Ответ 3

dt - имя вашей таблицы данных

ColumnName - ваше имя столбца i.e id

DataView view = new DataView(dt);
DataTable distinctValues = new DataTable();
distinctValues = view.ToTable(true, ColumnName);

Ответ 4

Попробуйте следующее:

var idColumn="id";
var list = dt.DefaultView
    .ToTable(true, idColumn)
    .Rows
    .Cast<DataRow>()
    .Select(row => row[idColumn])
    .ToList();

Ответ 5

Извините, что опубликовал ответ на очень старый поток. мой ответ может помочь другим в будущем.

string[] TobeDistinct = {"Name","City","State"};
DataTable dtDistinct = GetDistinctRecords(DTwithDuplicate, TobeDistinct);

    //Following function will return Distinct records for Name, City and State column.
    public static DataTable GetDistinctRecords(DataTable dt, string[] Columns)
       {
           DataTable dtUniqRecords = new DataTable();
           dtUniqRecords = dt.DefaultView.ToTable(true, Columns);
           return dtUniqRecords;
       }