タイガーラック クリエイティブブログ
2025
January
31

C# LINQ:パフォーマンスと可読性を向上させる5つの重要トピック

LINQ(Language Integrated Query)は C# のデータ操作を強力にサポートする機能です。

一般的によく使われるのは Where(), Select(), OrderBy() ……
しかし、あまり使われない、または知られていないけど便利な機能も数多く存在します。

本記事では、LINQ を最大限に活用するため、便利かつ可読性を向上させるための機能を基本を抑えつつ厳選して5つ紹介します。

クエリ構文 vs メソッド構文

LINQ には『クエリ構文』と『メソッド構文』の2つの記述方法があります。

クエリ構文

var result = from item in items
             where item.Age > 20
             orderby item.Name
             select item;

メソッド構文

var result = items.Where(item => item.Age > 20)
                  .OrderBy(item => item.Name);

ポイント

  • クエリ構文は SQL に近い記述 で可読性が高い。
  • メソッド構文は ラムダ式と組み合わせやすい ので柔軟。
  • 複雑な操作(Join() など)はメソッド構文が扱いやすい。

遅延評価

LINQ の多くのメソッド(Where, Select など)は遅延評価されます。
つまり、実際にデータを取得するまでクエリが実行されません。

例:遅延評価の動作

var query = items.Where(item => item.Age > 20); // ここではまだ実行されない

foreach (var item in query) // ここで初めて評価される
{
    Console.WriteLine(item.Name);
}

一方、ToList(), Count(), First() などのメソッドを呼び出すと、その時点でクエリが即時評価(Eager Execution)されます。

例:即時評価(Eager Execution)

var list = items.Where(item => item.Age > 20).ToList(); // ここでクエリが実行され、データがメモリに格納される

Any() vs Count() > 0 の使い分け

リストに要素があるか確認する場合、Count() を使うのは非効率です。

非推奨

if (items.Count() > 0) // リスト全体を走査する可能性あり
{
    // 処理
}

推奨

if (items.Any()) // 最初の要素が見つかれば即終了
{
    // 処理
}

ポイント

  • Count() は全要素をカウントするため、データの量が増えるほど処理時間も増える可能性がある。
  • Any() は最初の要素が見つかると即終了するため高速。

TryGetNonEnumeratedCount() で効率的な件数取得

通常の Count()IEnumerable<T> を強制的に列挙する可能性がありますが、.NET6 以降の TryGetNonEnumeratedCount() を使うとメモリ効率よく件数を取得できます。

例:最適な件数取得方法

var list = new List<int> { 1, 2, 3, 4, 5 };
if (list.TryGetNonEnumeratedCount(out int count))
{
    Console.WriteLine($"Count: {count}"); // List count: 5
}

ポイント

  • Count() を使うと、リスト全体を走査する可能性あり。
  • TryGetNonEnumeratedCount() は即座に件数を取得可能(パフォーマンス向上)。

MaxBy() & MinBy() で最大・最小要素を取得

.NET6以降では、最大・最小の値ではなく、対象のオブジェクト自体を取得できる MaxBy() / MinBy() が追加されました。

例:最高価格の商品を取得

var products = new[]
{
    new { Name = "A", Price = 100 },
    new { Name = "B", Price = 200 },
    new { Name = "C", Price = 150 }
};

var mostExpensive = products.MaxBy(p => p.Price);
Console.WriteLine(mostExpensive.Name); // B

ポイント

  • .OrderBy() , .LastOrDefault() を使わずにシンプルに記述可能。
  • .MaxBy()Max() の代替として可読性とパフォーマンスが向上する。

まとめ

今回紹介したテクニックを活用すると、LINQの処理効率を向上させることができます。
LINQを適切に活用し、よりパフォーマンスの良いC#コードを実装しましょう!

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.