基于这个问题:
[如何使用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列而不是整列应用唯一过滤器时获取整行?
答案 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
,然后是Min
,Sum
等聚合函数,以便为每列选择一个行值。
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"])