3

我有一个 DataRow 对象的集合。我应该根据“URL_Link”列选择不同的行。在这篇文章之后,我想出了下面的代码。
是否可以将其应用于 DataRow 集合?

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

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

4

2 回答 2

5

除了您没有将结果集重新分配给result-variable 的小错误。

如果您实际上应该收到不同的值,我个人觉得使用不同的值要清楚得多。在这种情况下使用 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();
    }
于 2012-07-31T08:59:01.087 回答
3

您的 LINQ 操作的返回没有被分配给任何东西:

IEnumerable<DataRow> results = GetData();  
results = results.GroupBy(row => row.Field<string>("URL_Link")).Select(grp => grp.First());
于 2012-07-31T08:33:05.570 回答