我正在尝试使用DataTable
从Linq
中选择一个不同的值。DataTable
从具有动态列的excel工作表中填充,每个excel工作表都有一个列名SERIAL NUMBER
,这是强制性的。
我有一个演示用的DataTable
,它包含4个序列号,如下所示:
当我这么做
var distinctList = dt.AsEnumerable().Select(a => a).Distinct().ToList();
如果我做了
var distinctList = dt.AsEnumerable().Select(a => a.Field<string>("SERIAL NUMBER").Distinct().ToList();
然后我得到正确的结果,但是它只包含来自dt
的一列,而不是所有其他列。
我只拿到了四张唱片,而不是两张。有人能告诉我哪里出了问题吗?
发布于 2016-11-17 03:47:50
那么,您想按序列号对它们进行分组并检索完整的DataRow吗?假设在对它们进行分组之后,我们希望检索第一项:
var distinctList = dt.AsEnumerable().GroupBy(a => a.Field<string>("SERIAL NUMBER"))
.Select(a => a.FirstOrDefault()).Distinct().ToList();
编辑:按要求编辑
var distinctValues = dt.AsEnumerable().Select(a => a.Field<string>("SERIAL NUMBER")).Distinct().ToList();
var duplicateValues = dt.AsEnumerable().GroupBy(a => a.Field<string>("SERIAL NUMBER")).SelectMany(a => a.Skip(1)).Distinct().ToList();
var duplicatesRemoved = dt.AsEnumerable().Except(duplicateValues);
发布于 2016-11-17 03:43:05
问题是,默认情况下,Distinct
方法使用默认的相等比较器,对于DataRow
来说,这是通过引用进行比较。要获得所需的结果,可以使用Distinct
过载,它允许您传递IEqualityComparer<T>
和传递DataRowComparer.Default
DataRowComparer类用于比较DataRow对象的值,而不比较对象引用。
var distinctList = dt.AsEnumerable().Distinct(DataRowComparer.Default).ToList();
有关更多信息,请参见比较DataRows ()。
发布于 2016-11-17 03:19:35
在ToTable方法中,第一个参数指定是否需要Distinct
记录,第二个参数指定我们要区分的列名。
DataTable returnVals = dt.DefaultView.ToTable(true, "ColumnNameOnWhichYouWantDistinctRecords");
这里没有必要使用linq来完成这个任务!
https://stackoverflow.com/questions/40653432
复制相似问题