クエリの作り方。3パターン。
成果物
情報源
クエリ
- クエリ構文
- メソッド構文
- 併用
クエリは上記3つの方法で作成できる。
1. クエリ構文
1-1. where
class Main { public void Run() { List<int> list = new List<int>() { 3, 1, 5, 4, 2 }; Odds(list); } private void Odds(List<int> list) { IEnumerable<int> query = from v in list where 1 == (v % 2) select v; Console.WriteLine($"{string.Join(",", query.ToList())}"); } }
3,1,5
1-2. orderby
class Main { public void Run() { List<int> list = new List<int>() { 3, 1, 5, 4, 2 }; Sort(list); } private void Sort(List<int> list) { IEnumerable<int> query = from v in list orderby v ascending select v; Console.WriteLine($"{string.Join(",", query.ToList())}"); } }
1,2,3,4,5
1-3. group
class Main { public void Run() { Group(); } private void Group() { string[] list = new string[] { "carrots", "cabbage", "broccoli", "beans", "barley" }; IEnumerable<IGrouping<char, string>> query = from item in list group item by item[0]; foreach (var g in query) { Console.WriteLine($"group: {g.Key}"); foreach (var v in g) { Console.WriteLine($" {v}"); } } } }
group: c carrots cabbage group: b broccoli beans barley
2. メソッド構文
上記のクエリ部分をメソッド構文で書くと以下。
IEnumerable<int> query = list.Where(v => 1 == (v % 2)).Select(v => v);
IEnumerable<int> query = list.OrderBy(v => v).Select(v => v);
IEnumerable<IGrouping<char, string>> query = list.GroupBy(v => v[0]);
クエリ構文では表現できないメソッドも多数ある。集計関数など。
class Main { public void Run() { List<int> list = new List<int>() { 3, 1, 5, 4, 2 }; Functions(list); Concat(list); } private void Functions(List<int> list) { IEnumerable<int> query = from v in list where 1 == (v % 2) select v; Console.WriteLine($"{string.Join(",", query.ToList())}"); Console.WriteLine($"Average(): {query.Average()}"); Console.WriteLine($"Sum(): {query.Sum()}"); Console.WriteLine($"Max(): {query.Max()}"); Console.WriteLine($"Min(): {query.Min()}"); } private void Concat(List<int> list) { List<int> list2 = new List<int>() { 9, 7, 0, 8, 6 }; // Console.WriteLine($"Concat(): {list.Concat(list2).ToList()}"); Console.WriteLine($"Concat(): {string.Join(",", list.Concat(list2).ToList())}"); } }
3,1,5 Average(): 3 Sum(): 9 Max(): 5 Min(): 1 Concat(): 3,1,5,4,2,9,7,0,8,6
他にも多数のメソッドがある。
3. 併用
class Main { public void Run() { List<int> list = new List<int>() { 3, 1, 5, 4, 2 }; Combinate1(list); Combinate2(list); } private void Combinate1(List<int> list) { IEnumerable<int> query = from v in list where 1 == (v % 2) select v; Console.WriteLine($"count: {query.Count()}"); } private void Combinate2(List<int> list) { int count = (from v in list where 1 == (v % 2) select v).Count(); Console.WriteLine($"count: {count}"); } }
count: 3 count: 3
型の略記
var
型としてIEnumerable<...>
を省略できる。
before
IEnumerable<int> query = from v in list where 1 == (v % 2) select v;
after
var query = from v in list where 1 == (v % 2) select v;
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- SQLite 3.29.0 ※
- C# dotnet 3.0.100 ※
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux