「C#.NET」 データ操作の究極「LINQ」の使い方の基本 〜冥界の神が明かす基礎〜

2024年11月16日土曜日

クエリ コレクション データベース

t f B! P L

名前空間 System.Linq

自己紹介

おお、余が誰かも知らぬというのか?まあよい。余は冥界を統べる者だ。だが今日は死者のことではなく、「C#.NET」のLinqクラスについて教えよう。Linq(Language Integrated Query)は、データ操作を簡潔かつ直感的に行える魔法のような存在だ。耳を傾けよ、さすれば賢者の知識を得られるであろう。

基本機能

Linqはデータソース(配列、リスト、データベースなど)にクエリを記述するための方法を提供する。これにより、データを簡単に検索、並び替え、集計できる。まずは基本的なコードを見てみるがよい。

C#

// Linqの基本的な使用例
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        // データソース
        int[] numbers = { 1, 2, 3, 4, 5, 6 };

        // クエリ式
        var evenNumbers = numbers.Where(n => n % 2 == 0);

        // 結果を表示
        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num); // 2 4 6
        }
    }
}

速度についての注意点

Linqは非常に便利だが、パフォーマンス面で注意が必要な場合がある。特に、大量のデータを扱う際には、Whereメソッドのような繰り返し処理に注意せよ。場合によっては、手動でループを書く方が速いこともあるのだ。

C#
// Linqと手動ループの速度をStopwatchで比較
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

class Program
{
    static void Main()
    {
        // データソース
        int[] numbers = Enumerable.Range(1, 1000000).ToArray();

        // StopwatchでLinqの時間を計測
        var stopwatch = Stopwatch.StartNew();
        var linqResult = numbers.Where(n => n % 2 == 0).ToList();
        stopwatch.Stop();
        Console.WriteLine($"Linqの実行時間: {stopwatch.ElapsedMilliseconds} ms");

        // Stopwatchで手動ループの時間を計測
        stopwatch.Restart();
        var manualResult = new List();
        foreach (var num in numbers)
        {
            if (num % 2 == 0)
                manualResult.Add(num);
        }
        stopwatch.Stop();
        Console.WriteLine($"手動ループの実行時間: {stopwatch.ElapsedMilliseconds} ms");
    }
}

クエリ構文とメソッド構文の違い

Linqにはクエリ構文とメソッド構文の2種類がある。それぞれの使い方を見てみよう。

C#
// クエリ構文とメソッド構文の比較
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        string[] names = { "冥界", "天空", "大地", "海" };

        // クエリ構文
        var querySyntax = from name in names
                          where name.Contains("冥")
                          select name;

        // メソッド構文
        var methodSyntax = names.Where(name => name.Contains("冥"));

        // 結果を表示
        foreach (var name in querySyntax)
        {
            Console.WriteLine(name); // 冥界
        }
    }
}

具体的な使い方

世界の国々の人口データを用いて、人口が10億を超える国を人口密度の降順に並べる例を示す。

C#

// 世界の人口データを使ったLinqの例
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var countries = new[]
        {
            new { Name = "中国", Population = 1444216107, Density = 153 },
            new { Name = "インド", Population = 1393409038, Density = 464 },
            new { Name = "アメリカ", Population = 331893745, Density = 36 },
            new { Name = "インドネシア", Population = 273523621, Density = 151 },
            new { Name = "パキスタン", Population = 225199937, Density = 287 },
            new { Name = "ブラジル", Population = 213993437, Density = 25 },
            new { Name = "ナイジェリア", Population = 206139587, Density = 223 },
            new { Name = "バングラデシュ", Population = 166303498, Density = 1265 },
            new { Name = "ロシア", Population = 145912025, Density = 9 },
            new { Name = "日本", Population = 126050804, Density = 347 }
        };
        //人口が10億を超えている国で、人口密度で降順
        var result = countries
            .Where(c => c.Population > 1000000000)
            .OrderByDescending(c => c.Density)
            .ToList();

        foreach (var country in result)
        {
            Console.WriteLine($"{country.Name} (人口: {country.Population}, 密度: {country.Density})");
        }
    }
}

解説

このコードでは、Whereメソッドを使って人口が10億を超える国をフィルタリングし、OrderByDescendingメソッドで人口密度が高い順に並べています。このようにLinqを活用することで、複雑なデータ処理が簡単に記述できます。

Linqは、単なる便利なツールではなく、データを効率的に操作するための力強い味方だ。さあ、今日から君もLinqを駆使し、新たな地平を切り開くのだ!

このブログを検索

QooQ