はじめに
前回(【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について書いてみました。
今回は前回の記事への追記ではなく、別記事として書きました。
暫くこの方法で書いていこうと思っています。