从大型DataTable列中选择不同的值

use*_*743 25 c# datatable

我有一个包含22列的DataTable,其中一列名为"id".我想查询此列并将所有不同的值保留在列表中.该表可以有10到100万行.

这样做的最佳方法是什么?目前我正在使用for循环来遍历列并比较值,如果值相同则它会转到下一个,当不相同时,它会将id添加到数组中.但是因为表可以有10到100万行,所以有更有效的方法来做到这一点!我怎样才能更有效地做到这一点?

Ehs*_*san 45

方法1:

   DataView view = new DataView(table);
   DataTable distinctValues = view.ToTable(true, "id");
Run Code Online (Sandbox Code Playgroud)

方法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;
    }
Run Code Online (Sandbox Code Playgroud)

然后你可以使用与列表不同的

      YourList.Select(x => x.Id).Distinct();
Run Code Online (Sandbox Code Playgroud)

请注意,这将返回完整的记录,而不仅仅是ID.


Raj*_*mar 30

这将使你回归不同的ID

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


Vee*_*eer 12

dt- 您的数据表名称

ColumnName- 你的列名,即id

DataView view = new DataView(dt);
DataTable distinctValues = new DataTable();
distinctValues = view.ToTable(true, ColumnName);
Run Code Online (Sandbox Code Playgroud)


小智 6

这一切都归功于 Rajeev Kumar 的回答,但我收到了一个评估为字符串的匿名类型列表,这并不容易迭代。如下更新代码有助于返回一个更易于操作的列表(或者,例如,直接放入 foreach 块中)。

var distinctIds = datatable.AsEnumerable().Select(row => row.Field<string>("id")).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)