連載:[完全版]究極のC#プログラミング

Chapter14 拡張メソッド

川俣 晶
2010/03/01

14.12 コレクションに拡張されるメソッド

 MSDNのリファレンスでは、拡張メソッドによって実現されたメソッドは、通常のメソッドとは別にまとめられている。コレクションであるList<T>クラスなどのメンバー一覧を見ると、「メソッド」の下に別に「Extensionのメソッド」という項目がある(版が違うと表記が違うかもしれない)。これが拡張メソッドである。

List(T)メンバ
http://msdn.microsoft.com/ja-jp/library/d9hw1as6.aspx

 ちなみに、Extensionの訳語は揺れているようで、「拡張」メソッドと表記されることもあれば、このように「Extension」のメソッドと表記されることもある。さらに、IntelliSenseを発動させると「拡張子」と表示されることもあるが、これは誤訳であろう(ちなみに、ファイルの拡張子は英語では「filename extension」なので、文脈を考えずに単語単位で訳しての誤訳であろう)。

 さて、ここではList<T>クラスを例にして、どのようなメソッドが拡張されているか見てみよう(ほかのコレクションのクラスも同様に拡張されている)。

 まず、これらのメソッドの多くは、実はList<T>クラスに対して拡張されて“いない”ことに着目しよう。実際には、List<T>クラスが実装しているIEnumerable<T>インターフェースに対する拡張として定義されている。拡張メソッドの実装そのものは、System.Linq.Enumerableクラスに存在する。

 この事実は、実はLINQが「コレクション」ではなく「列挙」に対して作用する機能であることを示しているが、これはLINQを解説する際にあらためて取り上げよう。

 さて、以上のような前提を踏まえて、List<T>クラスの拡張メソッドの一覧を見ていこう(次ページ表14.2参照)。

メソッド 機能
Aggregate シーケンスの値を結合していく処理を行う
All シーケンスのすべての要素が条件を満たしているかを判断する
Any 何らかの要素が存在するか、または指定条件を満たす要素が1つでもあるかを判断する
AsEnumerable 自分自身をIEnumerable<T>型として返す
AsQueryable 自分自身をIQueryable<T>型またはIQueryable型に変換する
Average シーケンスの平均値を計算する
Cast 非ジェネリックのコレクションでクエリを可能とする(ジェネリックのList<T>クラスで使用する意味があるかは不明)
Concat 2つのシーケンスを連結する
Contains 指定した要素がシーケンスに含まれているかどうかを判断する
Count シーケンス内の要素数または条件を満たす要素数を返す
DefaultIfEmpty 指定されたシーケンスの要素を返すが、シーケンスが空の場合は既定値を返す
Distinct シーケンスから一意の要素を返す
ElementAt シーケンス内の指定されたインデックス位置にある要素を返す
ElementAtOrDefault ElementAtメソッドと同じだが、インデックスが範囲外の場合は既定値を返す
Except 2つのシーケンスの差集合を生成する
First シーケンスの最初の要素または条件を満たす最初の要素を返す
FirstOrDefault Firstメソッドと同じだが、シーケンスに要素が含まれていない場合は既定値を返す
Intersect 2つのシーケンスの積集合を生成する
Last シーケンスの最後の要素または条件を満たす最後の要素を返す
LastOrDefault Lastメソッドと同じだが、シーケンスに要素が含まれていない場合は既定値を返す
LongCount Countメソッドと同じだが、Int64型で返す
Max シーケンスの最大値を返す
Min シーケンスの最小値を返す
OfType 指定された型に基づいて要素をフィルタ処理する(別の型のシーケンスに変換する)
Reverse シーケンスの要素の順序を反転させる
SequenceEqual 2つのシーケンスが等しいかどうかを判断する
Single シーケンスの唯一の要素または条件を満たす唯一の値を返す。複数ある場合は例外を投げる
SingleOrDefault Singleメソッドと同じだが、シーケンスが空の場合は既定値を返す
Skip シーケンス内の指定された数の要素をバイパスし、残りの要素を返す
SkipWhile 指定された条件が満たされる限り、シーケンスの要素をバイパスした後、残りの要素を返す
Sum シーケンスの合計を計算する。Aggregateメソッドと違って、加算処理そのものは自前で実行できないことに注意
Take シーケンスの先頭から、指定された数の連続する要素を返す
TakeWhile 指定された条件が満たされる限り、シーケンスから要素を返す
ToArray 同じ型、同じ要素の配列を作成する
ToList List<T>オブジェクトを作成する(これをList<T>型のコレクションから使って意味があるかは不明)
Union 2つのシーケンスの和集合を生成する
Where 述語に基づいて値のシーケンスをフィルタ処理する列挙オブジェクトを返す(指定条件を満たす要素だけを列挙する列挙オブジェクトを返す)
表14.2 List<T>クラスの拡張メソッド一覧


 INDEX
  [完全版]究極のC#プログラミング
  Chapter14 拡張メソッド
    1.14.1 C# 2.0プログラマーの悲劇
    2.14.2 Allメソッドを利用するのに必要な記述
    3.14.3 拡張メソッドの概要
    4.14.4 スイッチなしで機能する例
    5.14.5 sealedクラスを拡張する
    6.14.6 拡張メソッドはオブジェクト内部に手出しできない
    7.14.7 拡張メソッドはオブジェクトの振る舞いを変更できない
    8.14.8 拡張メソッドが安全である理由
    9.14.9 メソッド呼び出しと型の関係
    10.14.10 thisの正体
    11.14.11 拡張メソッドを使用すべきとき
  12.14.12 コレクションに拡張されるメソッド
    13.14.13 なぜ「using System.Linq;」なのか?/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間