我有一组DataRow对象。我应该根据“URL_Link”列选择不同的行。在this post之后,我提出了以下代码 是否可以将其应用于DataRow集合?
IEnumerable<DataRow> results = GetData();
results.GroupBy(row => row.Field<string>("URL_Link")).Select(grp => grp.First());
它在语法上是正确的,但它没有解决问题。它不会删除重复的行。我做错了什么?
答案 0 :(得分:5)
除了您未将结果集重新分配给result
- 变量的次要错误。
Personaly我觉得使用一个独特的更清楚,如果你实际上应该接受不同的值。 Groupby在这种情况下使用并不是很清楚,如果返回整行是有意的,请查看下面的第一个样本或者第二个样本。
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();
}
}
这或多或少完全是你提供的。首先,您没有重新分配变量。然后你应该从ItemArray到达你的领域。你看到上面的例子,它给出了这个输出:
57 yahoo.com
130 google.com
25 home.live.com
30 stackoverflow.com
7 mysite.com
请记住,您可能必须指定Select,Orderby和Where子句取决于您是否需要返回特定的行(即访问次数最多的副本)。
如果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();
}
答案 1 :(得分:3)
LINQ操作的返回没有分配给任何东西:
IEnumerable<DataRow> results = GetData();
results = results.GroupBy(row => row.Field<string>("URL_Link")).Select(grp => grp.First());