Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从大型DataTable列中选择不同的值_C#_Datatable - Fatal编程技术网

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

C# 从大型DataTable列中选择不同的值,c#,datatable,C#,Datatable,我有一个包含22列的DataTable,其中一列名为id。我想查询这一列,并将所有不同的值保留在一个列表中。该表可以有10到100万行 最好的方法是什么?目前,我使用for循环遍历列并比较值,如果值相同,则转到下一个,如果不相同,则将id添加到数组中。但是,由于表可以有10到100万行,有没有更有效的方法来实现这一点!如何才能更有效地执行此操作?这将重新运行不同的ID var distinctIds = datatable.AsEnumerable()

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


最好的方法是什么?目前,我使用for循环遍历列并比较值,如果值相同,则转到下一个,如果不相同,则将id添加到数组中。但是,由于表可以有10到100万行,有没有更有效的方法来实现这一点!如何才能更有效地执行此操作?

这将重新运行不同的ID

 var distinctIds = datatable.AsEnumerable()
                    .Select(s=> new {
                        id = s.Field<string>("id"),                           
                     })
                    .Distinct().ToList();
dt-您的数据表名称

ColumnName-您的ColumnName,即id

DataView view = new DataView(dt);
DataTable distinctValues = new DataTable();
distinctValues = view.ToTable(true, ColumnName);
试试这个:

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

方法2: 您必须创建一个与datatable列名匹配的类,然后可以使用以下扩展方法将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;
    }

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

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

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

所有这一切都归功于Rajeev Kumar的回答,但我收到了一个匿名类型列表,该列表的计算结果为string,这并不像迭代那么容易。如下所示更新代码有助于返回一个更易于操作的列表,例如,直接放入foreach块

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

您想获得不同的id吗?如果您在一个数据表或数据库表中保留1000万行,最好是在数据库中执行此操作,然后再取回数据表(如果您有数据表的话)-它将能够非常有效地执行此操作,尤其是当id是索引列时。您还没有说明数据是否按ID列排序。如何构建datatable?这会减少到不同的值-代码中的哪个方法负责减少到不同的值?view.ToTable是方法,将第一个参数设置为true以获取所有不同的值。非常好-我使用了这个方法。使用较新的C语法可以省略第二行:var view=new DataViewdt;var distinctValues=view.ToTabletrue,ColumnName;您可能还希望通过在创建DataView对象之前或创建DataView对象时设置DataViews sort属性对不同的值进行排序:var view=new DataViewdt{sort=columnName};很好,我认为这个答案是最灵活的。谢谢你,Rajeevgreat!!使用datatable列出并使用linq进行区分。。。
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;
       }
var distinctIds = datatable.AsEnumerable().Select(row => row.Field<string>("id")).Distinct().ToList();