Select distinct仅选择单列

时间:2012-11-27 13:17:22

标签: c# linq distinct-values

基于这个问题:

[如何使用LINQ进行SELECT UNIQUE?

我编写了下面的表达式来选择OrganizationID数据集中包含多列的唯一dt列的行。

var distinctRows = (from DataRow dRow in dt.Rows
                    select new { col1 = dRow["OrganizationID_int"] }).Distinct();

但是当我在执行表达式后检查distinctRows时,它只有1列(col1)的记录,而不是保留整列。我担心添加col2=...等表达式可能会被解释为我希望在所有这些列上选择distinct。

那么如何在仅对1列而不是整列应用唯一过滤器时获取整行?

5 个答案:

答案 0 :(得分:5)

  

我想要所有满足这种独特条件的整行   列。我想在下一步中进行迭代。

因此,您不希望按该字段分组并返回多行中的一行。您只需要唯一的行。

一种方法是使用Enumerable.GroupBy并计算每组中的行数:

var uniqueRows = dt.AsEnumerable()
                   .GroupBy(r => r.Field<int>("OrganizationID_int"))
                   .Where(g => g.Count() == 1)
                   .Select(g => g.First());

答案 1 :(得分:1)

有两种版本的Distinct异常方法,其中一种方法可以IEqualityComparar来确定您将如何区分不同的元素。

以下是如何使用此方法的完整示例:

class Item
{
    public int Id {get; set;}
    public string Name {get;set;}
}

class ItemComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Item x)
    {
        return x.Id;
    }
}

void Main()
{
  var sequence = new List<Item>() 
  {
      new Item {Id = 1, Name = "1"}, 
      new Item {Id = 1, Name = "2"}
  };

  // Using overloaded version of Distinct method!
  var distinctSequence = sequence.Distinct(new ItemComparer());

  // distinctSequence contains inly one Item with Id = 1
  distinctSequence.Dump();
}

答案 2 :(得分:1)

您要找的是GroupBy,然后是MinSum等聚合函数,以便为每列选择一个行值。

var distinctRows = 
    (from DataRow dRow in dt.Rows
    group dRow by dRow["OrganizationID_int"] into g
    select new { OrgId = g.Key; Col2 = g.First().Col2, Col3 = g.First().Col3 })

答案 3 :(得分:1)

使用Linq to DataSet分组:

var distinctRows = from row in dt.AsEnumerable()
                   group row by new { 
                      col1 = row.Field<int>("OrganizationID_int")
                      // other columns here 
                   } into g
                   select g.First();

答案 4 :(得分:1)

查看 MoreLinq DistinctBy method,您可以使用它来表达您的查询:

dt.Rows.DistinctBy(dRow => dRow["OrganizationID_int"])