按IEnumerable <DataRow>分组

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)

它在语法上是正确的,但它没有解决问题.它不会删除重复的行.我究竟做错了什么?

Ind*_*ent 5

除了您没有将结果集重新分配给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)