31

22 列の DataTable があり、列の 1 つは「id」と呼ばれます。この列をクエリして、すべての個別の値をリストに保持したいと思います。テーブルには、10 ~ 100 万行の行を含めることができます。

これを行うための最良の方法は何ですか? 現在、forループを使用して列を調べて値を比較しています。値が同じ場合は次の値に進み、同じでない場合はIDを配列に追加します。しかし、テーブルには 10 から 100 万の行が含まれる可能性があるため、これを行うためのより効率的な方法があります。これをより効率的に行うにはどうすればよいですか?

4

7 に答える 7

50

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

これにより、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 に答える
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 に答える