簡體   English   中英

從大型 DataTable 列中選擇不同的值

[英]Select distinct values from a large DataTable column

我有一個包含 22 列的數據表,其中一列稱為“id”。 我想查詢此列並將所有不同的值保留在列表中。 該表可以有 10 到 100 萬行。

執行此操作的最佳方法是什么? 目前我正在使用 for 循環遍歷列並比較值,如果值相同,則轉到下一個,如果不相同,則將 id 添加到數組中。 但是由於表可以有 10 到一百萬行,所以有更有效的方法來做到這一點! 我將如何更有效地做到這一點?

方法一:

   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。

這將返回您不同的 ID

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

dt - 您的數據表名稱

ColumnName - 您的列名,即 id

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

所有功勞都歸功於 Rajeev Kumar 的回答,但我收到了一個評估為字符串的匿名類型列表,它並不容易迭代。 更新如下代碼有助於返回一個更易於操作的 List(或者,例如,直接放入 foreach 塊)。

var distinctIds = datatable.AsEnumerable().Select(row => row.Field<string>("id")).Distinct().ToList();

試試這個:

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

很抱歉為非常舊的線程發布答案。 我的回答將來可能會幫助其他人。

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;
       }

注意: 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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM