Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

ラムダ式でステップアップ! C#のプログラムから汎用的なアルゴリズムを切り出すことで、LINQについての理解を深めよう

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/10/14 14:00

 本稿では、C#のプログラムをリファクタリングして、汎用的なアルゴリズムを切り出し、利用する流れをステップバイステップで解説します。また、C# 3.0で採用されたラムダ式がそれを利用するのに、いかに便利なのか、どういう仕組みなのか、を紹介します。それにより、LINQ(Language INtegrated Query:統合言語クエリ)についての理解も深めていただけると思います。

目次

1. はじめに

 プログラミング言語 C#では、C# 3.0から「ラムダ式」と呼ばれるものが使えるようになり、プログラムをより簡潔に記述できるようになりました。そして、それにより、LINQ(Language INtegrated Query:統合言語クエリ)という機能が便利に使えるようになりました。

 この記事では、基本に立ち返って、どのようにしてアルゴリズムを記述し、それを利用するかを考えたいと思います。

 汎用的なアルゴリズムをどのように記述すると良いのか、そしてそのアルゴリズムがどのように使われると良いのか、を述べます。その中で、なぜラムダ式が便利なのか、その理由が分かってもらえれば幸いです。

 また、ラムダ式がどのような仕組みなのか、それについても解説します。

 LINQの仕組みや意義についても同時に理解していただけることと思います。

 次の記事の姉妹記事です。そちらでC++用に書かれた記事をC#用にしたものです。併せて読まれるとC++との違いが分かると思います。

対象読者

  • C#で開発を行っている方
  • 初級から中級以上にステップアップしたいC#プログラマーの方

必要な環境

 Visual Studio 2013(注1)など、C# 3.0以上のC#(ラムダ式が使えるC#)がコンパイル・実行できる環境。

2. 最初のプログラム

 まず、C#で書いたサンプルプログラムを1つ用意します。

 このサンプルプログラムは、出版社クラス Publisherと書籍クラス Bookを持ちます。メインの部分では、PublisherとBookのコレクションをそれぞれ持ち、その中からある条件に一致したものを表示します。

出版社クラス Publisher

Publisher.cs
class Publisher
{
    public string Name { get; set; }
};

書籍クラス Book

 出版社のインデックスを持っています。

Book.cs
class Book
{
    public string Code           { get; set; }
    public string Title          { get; set; }
    public int    PublisherIndex { get; set; }
};

 この2つのクラスのインスタンスのそれぞれのコレクションを作り、その中から「特定の文字列を名称に含むもの」を表示してみます。 例えば、書籍のタイトルまたは出版社の名前に "リ" を含むものをコンソールに表示してみましょう。

メイン プログラム(書籍のタイトルまたは出版社の名前に "リ" を含むものをコンソールに表示)

Program.cs
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var publisherList = new List<Publisher> {
            new Publisher { Name = "技術評論社"          },
            new Publisher { Name = "翔泳社"              },
            new Publisher { Name = "オライリー・ジャパン"},
            new Publisher { Name = "SBクリエイティブ"    }
        };

        var bookList      = new List<Book> {
            new Book { Code           = "4774149489"                        ,
                       Title          = "C# ポケットリファレンス"           ,
                       PublisherIndex = 0                                   },
            new Book { Code           = "4798114618"                        ,
                       Title          = "C#の絵本"                          ,
                       PublisherIndex = 1                                   },
            new Book { Code           = "4798122203"                        ,
                       Title          = "独習C# 第3版"                      ,
                       PublisherIndex = 1                                   },
            new Book { Code           = "4873116503"                        ,
                       Title          = "プログラミングC# 第7版"            ,
                       PublisherIndex = 2                                   },
            new Book { Code           = "4797361344"                        ,
                       Title          = "猫でもわかるC#プログラミング 第2版",
                       PublisherIndex = 3                                   }
        };

        var searchWord    = "リ";

        foreach (var book in bookList) {
            var publisherName = publisherList[book.PublisherIndex].Name;
            if (book.Title   .Contains(searchWord) ||
                publisherName.Contains(searchWord))
                Console.WriteLine("コード: {0}, タイトル: {1}, 出版社: {2}",
                                  book.Code, book.Title, publisherName);
        }
    }
}

 実行してみると、次のようにタイトルまたは出版社の名前に "リ" を含む書籍が表示されます。

実行結果
コード: 4774149489, タイトル: C# ポケットリファレンス, 出版社: 技術評論社
コード: 4873116503, タイトル: プログラミングC# 第7版, 出版社: オライリー・ジャパン
コード: 4797361344, タイトル: 猫でもわかるC#プログラミング 第2版, 出版社: SBクリエイティブ

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 小島 富治雄(フジヲ)

    Microsoft MVP for C# (2005.07~)。 - 注目の MVP - Blog: プログラミング C# - 翔ソフトウェア (Sho's) - Web Site: 翔ソフトウェア (Sho's) - Twitter: Fujiwo...

All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5