按IEnumerable <datarow> </datarow>分组

时间:2012-07-31 08:25:06

标签: c# linq group-by datarow

我有一组DataRow对象。我应该根据“URL_Link”列选择不同的行。在this post之后,我提出了以下代码 是否可以将其应用于DataRow集合?

IEnumerable<DataRow> results = GetData();  
results.GroupBy(row => row.Field<string>("URL_Link")).Select(grp => grp.First());

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

2 个答案:

答案 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());