Linq Distinct没有带回正确的结果

时间:2016-11-17 11:14:02

标签: c# linq datatable

我尝试使用DataTableLinq中选择不同的值。从{Excel 1}填充DataTable,其中包含动态列,每个Excel工作表都有一个列名SERIAL NUMBER,这是强制性的。

我有DataTable用于演示目的,其中包含4个序列号:

  • 12345
  • 12345
  • 98765
  • 98765

当我这样做时

var distinctList = dt.AsEnumerable().Select(a => a).Distinct().ToList();

如果我这样做

var distinctList = dt.AsEnumerable().Select(a => a.Field<string>("SERIAL NUMBER").Distinct().ToList();

然后我得到了正确的结果,但它只包含dt中的一列而不是所有其他列

我得到所有四个记录而不是2.有人可以告诉我,我出错了。

4 个答案:

答案 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();