Nul*_*ead 3 c# linq group-by datarow
我有一组DataRow对象.我应该根据"URL_Link"列选择不同的行.在这篇文章之后,我提出了以下代码.
是否可以将其应用于DataRow集合?
IEnumerable<DataRow> results = GetData();
results.GroupBy(row => row.Field<string>("URL_Link")).Select(grp => grp.First());
Run Code Online (Sandbox Code Playgroud)
它在语法上是正确的,但它没有解决问题.它不会删除重复的行.我究竟做错了什么?
除了您没有将结果集重新分配给result-variable 的次要错误.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这或多或少完全是您提供的.首先,您没有重新分配变量.然后你应该从ItemArray到达你的领域.你看到上面的示例,它给出了这个输出:
57 yahoo.com
130 google.com
25 home.live.com
30 stackoverflow.com
7 mysite.com
Run Code Online (Sandbox Code Playgroud)
请记住,您可能必须指定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();
}
Run Code Online (Sandbox Code Playgroud)