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