我有一个包含22列的DataTable,其中一列名为“id”。我想查询此列并将所有不同的值保留在列表中。该表可以有10到100万行。
这样做的最佳方法是什么?目前我正在使用for循环来遍历列并比较值,如果值相同则它会转到下一个,当它不相同时,它会将id添加到数组中。但是因为表可以有10到100万行,所以有更有效的方法来做到这一点!我怎样才能更有效地做到这一点?
答案 0 :(得分:41)
方法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。
答案 1 :(得分:26)
这将返回不同的ID
var distinctIds = datatable.AsEnumerable()
.Select(s=> new {
id = s.Field<string>("id"),
})
.Distinct().ToList();
答案 2 :(得分:10)
dt
- 您的数据表名称
ColumnName
- 你的列名,即id
DataView view = new DataView(dt);
DataTable distinctValues = new DataTable();
distinctValues = view.ToTable(true, ColumnName);
答案 3 :(得分:3)
试试这个:
var idColumn="id";
var list = dt.DefaultView
.ToTable(true, idColumn)
.Rows
.Cast<DataRow>()
.Select(row => row[idColumn])
.ToList();
答案 4 :(得分: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;
}
答案 5 :(得分:1)
所有功劳归功于Rajeev Kumar的回答,但是我收到了一个评估为字符串的匿名类型列表,要遍历起来并不容易。如下更新代码有助于返回一个列表,该列表更易于操作(例如,直接放入foreach块中)。
var distinctIds = datatable.AsEnumerable().Select(row => row.Field<string>("id")).Distinct().ToList();
答案 6 :(得分: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());