我尝试使用DataTable
从Linq
中选择不同的值。从{Excel 1}填充DataTable
,其中包含动态列,每个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
中的一列而不是所有其他列
我得到所有四个记录而不是2.有人可以告诉我,我出错了。
答案 0 :(得分:2)
在ToTable方法中,第一个参数指定是否需要Distinct
个记录,第二个参数指定我们将使哪个列名称不同。
DataTable returnVals = dt.DefaultView.ToTable(true, "ColumnNameOnWhichYouWantDistinctRecords");
这里没有必要使用linq来完成这项任务!
答案 1 :(得分:2)
那么,您想按序列号对它们进行分组并检索完整的DataRow吗?假设在对它们进行分组后,我们想要检索第一个项目:
ActiveSheet.Range("$A$2:$M$20368").AutoFilter Field:=10, Operator:= _
xlFilterValues, Criteria2:=Array(1, "1/29/2016", 1, "2/29/2016", 1, "3/31/2016", 0, _
"12/23/2015", 0, "12/22/2014", 0, "12/19/2013", 0, "12/20/2012", 0, "12/22/2011", 0, _
"12/20/2010", 0, "12/23/2009", 0, "12/22/2008", 0, "12/20/2007", 0, "12/21/2006", 0, _
"12/21/2005", 0, "12/21/2004", 0, "12/17/2003", 0, "12/19/2002", 0, "12/20/2001")
Rows("5:20366").Select
Selection.Delete Shift:=xlUp
ActiveSheet.Range("$A$2:$M$17496").AutoFilter Field:=9
ActiveSheet.Range("$A$2:$M$17496").AutoFilter Field:=10
ActiveSheet.Range("$A$2:$M$17496").AutoFilter Field:=9, Criteria1:=Array( _
"="), Operator:=xlFilterValues, Criteria2:=Array(0, "7/30/2105", 0, "1/2/2045" _
, 0, "5/7/2019", 0, "4/27/2018", 1, "8/31/2017", 1, "9/26/2017", 1, "10/27/2017", 1, _
"11/30/2017", 1, "12/21/2017", 1, "1/31/2016", 1, "2/29/2016", 1, "3/31/2016", 0, _
"12/23/2015", 0, "12/23/2014", 0, "12/20/2013", 0, "12/27/2012", 0, "12/23/2011", 0, _
"12/22/2010", 0, "12/23/2009", 0, "12/24/2008", 0, "12/21/2007", 0, "12/27/2006", 0, _
"12/23/2005", 0, "12/26/2004", 0, "12/24/2003", 0, "12/25/2002", 0, "12/21/2001", 0, _
"6/30/2000", 0, "10/4/1999", 0, "11/1/1996")
编辑:根据要求
var distinctList = dt.AsEnumerable().GroupBy(a => a.Field<string>("SERIAL NUMBER"))
.Select(a => a.FirstOrDefault()).Distinct().ToList();
答案 2 :(得分:1)
使用Linq,GroupBy会更好地适应它。
var groups = dt.AsEnumerable().GroupBy(a => a.SerialNumber).Select(_ => new {Key = _.Key, Items = _});
然后,这将包含基于序列号的分组。每组项目具有相同的序列号,但其他属性值不同。
答案 3 :(得分:0)
试试这个:
List<string> distinctValues = (from row in dt.AsEnumerable() select row.Field<string>("SERIAL NUMBER")).Distinct().ToList();
然而对我而言,这也有效:
List<string> distinctValues = dt.AsEnumerable().Select(row => row.Field<string>("SERIAL NUMBER")).Distinct().ToList();