やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#の概念 LINQ(クエリ作成)

 クエリの作り方。3パターン。

成果物

情報源

クエリ

  1. クエリ構文
  2. メソッド構文
  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;

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux