31

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

最好的方法是什么?目前,我正在使用 for 循环遍历列并比较值,如果值相同,则进入下一个,当不相同时,它将 id 添加到数组中。但是由于表可以有 10 到 100 万行,有没有更有效的方法来做到这一点!我将如何更有效地做到这一点?

4

7 回答 7

50

方法一:

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

方法2: 您必须创建一个与您的数据表列名称匹配的类,然后您可以使用以下扩展方法将数据表转换为列表

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

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

于 2013-07-04T09:13:58.873 回答
38

这将重新运行您不同的 Id

 var distinctIds = datatable.AsEnumerable()
                    .Select(s=> new {
                        id = s.Field<string>("id"),                           
                     })
                    .Distinct().ToList();
于 2013-07-04T09:12:11.733 回答
12

dt- 你的数据表名称

ColumnName- 你的列名,即 id

DataView view = new DataView(dt);
DataTable distinctValues = new DataTable();
distinctValues = view.ToTable(true, ColumnName);
于 2013-07-04T09:13:18.703 回答
6

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

var distinctIds = datatable.AsEnumerable().Select(row => row.Field<string>("id")).Distinct().ToList();
于 2019-02-21T01:32:51.800 回答
3

尝试这个:

var idColumn="id";
var list = dt.DefaultView
    .ToTable(true, idColumn)
    .Rows
    .Cast<DataRow>()
    .Select(row => row[idColumn])
    .ToList();
于 2013-07-04T09:13:57.833 回答
2

很抱歉为非常旧的线程发布答案。我的回答将来可能会对其他人有所帮助。

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;
       }
于 2017-02-05T17:20:21.217 回答
0

注意: Columns[0]是您要对其执行DISTINCT查询和排序的列

DataView view = new DataView(DT_InputDataTable);

DataTable distinctValues = new DataTable();

view = new DataView(DT_InputDataTable) { Sort = DT_InputDataTable.Columns[0].ToString() };

distinctValues = view.ToTable(true, DT_InputDataTable.Columns[0].ToString());
于 2021-08-09T11:49:23.230 回答