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は、このような場合に使用するのが明確ではありません。行全体を返すことを目的としている場合は、以下の最初のサンプル、または2番目のサンプルを参照してください。

    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 に答える