4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【C#】DataTable でのLINQの使い方(2)

Last updated at Posted at 2021-05-27

はじめに

前回(【C#】DataTable でのLINQの使い方(1))に引き続き、C#のDataTableクラスでLINQを使ったコードを簡単にまとめた内容を記載します。

複数条件に合ったデータの取得

DataTable から複数の条件に合ったレコードを取得
※前回記事の「条件に合ったデータの取得」項目に含むべきだったかな?

            DataTable member = new DataTable();
            member.Columns.Add("No", typeof(int));
            member.Columns.Add("Name", typeof(string));
            member.Columns.Add("Age", typeof(int));
            member.Columns.Add("Address", typeof(string));

            member.Rows.Add(1, "太郎", 35, "東京");
            member.Rows.Add(2, "次郎", 30, "東京");
            member.Rows.Add(3, "三郎", 25, "名古屋");
            member.Rows.Add(4, "四郎", 20, "名古屋");
            member.Rows.Add(5, "五郎", 15, "大阪");
            member.Rows.Add(6, "六郎", 10, "大阪");

            // AND の場合
            DataRow[] rows =
                member.AsEnumerable()
                      .Where(x => (int)x["Age"] > 20 && (string)x["Address"] == "東京")
                      .ToArray();

            Console.WriteLine("ANDの結果");
            foreach (DataRow row in rows)
                Console.WriteLine("No:{0},Name:{1},Age:{2},Address:{3}", row["No"], row["Name"], row["Age"], row["Address"]);

            // OR の場合
            rows =
                member.AsEnumerable()
                      .Where(x => (int)x["Age"] > 20 || (string)x["Address"] == "名古屋")
                      .ToArray();

            Console.WriteLine(Environment.NewLine + "ORの結果");
            foreach (DataRow row in rows)
                Console.WriteLine("No:{0},Name:{1},Age:{2},Address:{3}", row["No"], row["Name"], row["Age"], row["Address"]);

簡単な説明

  • Whereの取得条件の間に「AND (&&)」、「OR (||)」の論理演算子を追記する事で複数条件の記述ができます。
  • 「AND」と「OR」の2パターン記述してみました。
  • DataTableで結果を取得するパターンは最後の「ToArray()」部分が変わるだけなので以降省略します。

出力結果

ANDの結果
No:1,Name:太郎,Age:35,Address:東京
No:2,Name:次郎,Age:30,Address:東京

ORの結果
No:1,Name:太郎,Age:35,Address:東京
No:2,Name:次郎,Age:30,Address:東京
No:3,Name:三郎,Age:25,Address:名古屋
No:4,Name:四郎,Age:20,Address:名古屋

データのソート

DataTable のレコードをソート
※文字のセットされた項目を指定する場合は、「大文字」「小文字」「カルチャ」等が絡んでくるので注意、注意!!
 (忘れがちなので注意は2回書きました)

            DataTable member = new DataTable();
            member.Columns.Add("No", typeof(int));
            member.Columns.Add("Name", typeof(string));
            member.Columns.Add("Age", typeof(int));
            member.Columns.Add("Address", typeof(string));

            member.Rows.Add(1, "太郎", 30, "東京");
            member.Rows.Add(2, "次郎", 30, "東京");
            member.Rows.Add(3, "三郎", 20, "名古屋");
            member.Rows.Add(4, "四郎", 10, "名古屋");
            member.Rows.Add(5, "五郎", 20, "大阪");
            member.Rows.Add(6, "六郎", 10, "大阪");

            // Ageを昇順にソート
            DataRow[] rows =
                member.AsEnumerable()
                      .OrderBy(x => x["Age"])
                      .ToArray();

            Console.WriteLine("Ageを昇順にソートの結果");
            foreach (DataRow row in rows)
                Console.WriteLine("No:{0},Name:{1},Age:{2},Address:{3}", row["No"], row["Name"], row["Age"], row["Address"]);

            // Ageを降順にソート
            rows =
                member.AsEnumerable()
                      .OrderByDescending(x => x["Age"])
                      .ToArray();

            Console.WriteLine(Environment.NewLine + "Ageを降順にソートの結果");
            foreach (DataRow row in rows)
                Console.WriteLine("No:{0},Name:{1},Age:{2},Address:{3}", row["No"], row["Name"], row["Age"], row["Address"]);

            // 複数項目(AgeとAddress)でのソート
            rows =
                member.AsEnumerable()
                      .OrderBy(x => x["Age"])
                      .ThenBy(x => x["Address"])
                      .ToArray();

            Console.WriteLine(Environment.NewLine + "複数項目(AgeとAddress)でソートの結果");
            foreach (DataRow row in rows)
                Console.WriteLine("No:{0},Name:{1},Age:{2},Address:{3}", row["No"], row["Name"], row["Age"], row["Address"]);

簡単な説明

  • 昇順、降順、複数項目で、ソートの3パターンを記述してみました。
  • 2項目以降で降順を設定する場合は「ThenBy」の代わりに「ThenByDescending」を利用します。
  • 「Where」を使う事で取得条件の指定ができます。

出力結果

Ageを昇順にソートの結果
No:4,Name:四郎,Age:10,Address:名古屋
No:6,Name:六郎,Age:10,Address:大阪
No:3,Name:三郎,Age:20,Address:名古屋
No:5,Name:五郎,Age:20,Address:大阪
No:1,Name:太郎,Age:30,Address:東京
No:2,Name:次郎,Age:30,Address:東京

Ageを降順にソートの結果
No:1,Name:太郎,Age:30,Address:東京
No:2,Name:次郎,Age:30,Address:東京
No:3,Name:三郎,Age:20,Address:名古屋
No:5,Name:五郎,Age:20,Address:大阪
No:4,Name:四郎,Age:10,Address:名古屋
No:6,Name:六郎,Age:10,Address:大阪

複数項目(AgeとAddress)でソートの結果
No:6,Name:六郎,Age:10,Address:大阪
No:4,Name:四郎,Age:10,Address:名古屋
No:5,Name:五郎,Age:20,Address:大阪
No:3,Name:三郎,Age:20,Address:名古屋
No:1,Name:太郎,Age:30,Address:東京
No:2,Name:次郎,Age:30,Address:東京

おわりに

前回に引き続きLINQについて書いてみました。
今回は前回の記事への追記ではなく、別記事として書きました。
暫くこの方法で書いていこうと思っています。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?