【C#】DataTable でのLINQの使い方（２）

## **はじめに**


前回（[【C#】DataTable でのLINQの使い方（１）](https://qiita.com/HillPaddyField/items/e49bbdbcf01a57fcfc2c)）に引き続き、C#のDataTableクラスでLINQを使ったコードを簡単にまとめた内容を記載します。



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

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

```C#
            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」の２パターン記述してみました。
- 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 のレコードをソート
※文字のセットされた項目を指定する場合は、「大文字」「小文字」「カルチャ」等が絡んでくるので注意、注意！！
　（忘れがちなので注意は２回書きました）

```c#
            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"]);
```

簡単な説明

- 昇順、降順、複数項目で、ソートの３パターンを記述してみました。
- ２項目以降で降順を設定する場合は「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について書いてみました。
今回は前回の記事への追記ではなく、別記事として書きました。
暫くこの方法で書いていこうと思っています。