我有一组 DataRow 对象。基于列 'URL_Link',我应该选择不同的行。参考这篇帖子,我想到了下面的代码。
是否可以将其应用于 DataRow 集合?
IEnumerable<DataRow> results = GetData();
results.GroupBy(row => row.Field<string>("URL_Link")).Select(grp => grp.First());
这段代码语法正确,但是它并没有解决问题。它不能移除重复的行。我错在哪里了?
我有一组 DataRow 对象。基于列 'URL_Link',我应该选择不同的行。参考这篇帖子,我想到了下面的代码。
是否可以将其应用于 DataRow 集合?
IEnumerable<DataRow> results = GetData();
results.GroupBy(row => row.Field<string>("URL_Link")).Select(grp => grp.First());
这段代码语法正确,但是它并没有解决问题。它不能移除重复的行。我错在哪里了?
result
变量的小错误之外。 class Program
{
static DataTable GetData()
{
DataTable table = new DataTable();
table.Columns.Add("Visits", typeof(int));
table.Columns.Add("URL_Link", typeof(string));
table.Rows.Add(57, "yahoo.com");
table.Rows.Add(130, "google.com");
table.Rows.Add(92, "google.com");
table.Rows.Add(25, "home.live.com");
table.Rows.Add(30, "stackoverflow.com");
table.Rows.Add(1, "stackoverflow.com");
table.Rows.Add(7, "mysite.org");
return table;
}
static void Main(string[] args)
{
var res = GetData()
.AsEnumerable()
.GroupBy(row => row.Field<string>("URL_Link"))
.Select(grp => grp.First());
foreach (var item in res)
{
string text = "";
foreach (var clm in item.ItemArray)
text += string.Format("{0}\t", clm);
Console.WriteLine(text);
}
Console.ReadLine();
}
}
57 yahoo.com
130 google.com
25 home.live.com
30 stackoverflow.com
7 mysite.com
URL_Link
字段,则此示例非常清晰和简单。它只需要选择您想要的字段,然后对其进行去重。 static void Main(string[] args)
{
var res = GetData()
.AsEnumerable()
.Select(d=>d.Field<string>("URL_Link"))
.Distinct();
foreach (var item in res)
Console.WriteLine(item.ToString());
Console.ReadLine();
}
您的LINQ操作返回的结果并没有被赋值给任何变量:
IEnumerable<DataRow> results = GetData();
results = results.GroupBy(row => row.Field<string>("URL_Link")).Select(grp => grp.First());
Distinct()
使用IEqualityComparer<T>
接口来确定哪些项目是相似的。您可以创建自己的实现,并将其提供给“Distinct()`调用。这样,您就可以在完整数据集上调用Distinct()并通过仅比较“URL_Link”来获取完整行。 - Raxr