.NET TIPS

複数のオブジェクトを一時的に1つにまとめるには?[4以降、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2010/06/17

 クラスを定義するほどでもないが、複数の異なる型のオブジェクトを1つにまとめてメソッドの戻り値としたい、あるいはメソッドに渡したい、といったケースがたまにある。そのような用途に対しては、これまではObject型の配列などを使う必要があったが、.NET Framework 4では、お手軽かつ安全に使えるTupleクラス(System名前空間)が新しく追加されている(tupleとは「組」という意味)。

 使い方は簡単で、1つにまとめたい複数オブジェクトをパラメータとして、Tupleクラスの静的メソッドであるCreateメソッドを呼び出せばよい。Createメソッドには以下のようなオーバーロードが用意されており、8個までのオブジェクトを1つにまとめることができる(9個以上の場合には入れ子にすればよい)。

Create<T1>(T1)
Create<T1, T2>(T1, T2)
Create<T1, T2, T3>(T1, T2, T3)
Create<T1, T2, T3, T4>(T1, T2, T3, T4)
Create<T1, T2, T3, T4, T5>(T1, T2, T3, T4, T5)
Create<T1, T2, T3, T4, T5, T6>(T1, T2, T3, T4, T5, T6)
Create<T1, T2, T3, T4, T5, T6, T7>(T1, T2, T3, T4, T5, T6, T7)
Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1, T2, T3, T4, T5, T6, T7, T8)
TupleクラスにあるCreateメソッドの8つオーバーロード
これらはジェネリック・メソッドとして定義されているが、コンパイラの型推論により通常は型指定を省略できる(具体的な記述例は以下のサンプル・プログラムを参照)。

 次のコードは、3つのオブジェクトからなる組を作成するサンプル・プログラムである。このコードで示しているように、Tupleオブジェクト内の項目には、Item1、Item2、Item3といったプロパティによりアクセスできる。

using System;

class Program {
  static void Main() {

    // 3つの型のオブジェクトを1つにまとめる
    var myBag = Tuple.Create("お名前", 42, DateTime.Now);

    // Item1〜3プロパティにより項目にアクセス
    Console.WriteLine(myBag.Item1); // 出力:お名前
    Console.WriteLine(myBag.Item2); // 出力:42
    Console.WriteLine(myBag.Item3); // 出力:2010/06/17 9:43:33

    // 【参考】型を確認
    Console.WriteLine(myBag.Item3.GetType());
    // 出力:System.DateTime

    // 【参考】次の行はコンパイル・エラーとなる
    // string url = myBag.Item3;
    // error CS0029: 型 'System.Uri' を型 'string' に暗黙的に変換できません。

    // 【参考】すべてを明示的に記述
    Tuple<string, int, DateTime> myBag2
      = Tuple.Create<string, int, DateTime>
                        ("name", 42, DateTime.Now);

    // 【参考】Tupleクラスのコンストラクタを使用
    var myBag3 = new Tuple<string, int, DateTime>
                              ("name", 42, DateTime.Now);
  }
}
Option Strict

Imports System

Class Program
  Shared Sub Main

    ' 3つの型のオブジェクトを1つにまとめる
    Dim myBag = Tuple.Create("お名前", 42, DateTime.Now)

    ' Item1〜Item8プロパティにより項目にアクセス
    Console.WriteLine(myBag.Item1) ' 出力:お名前
    Console.WriteLine(myBag.Item2) ' 出力:42
    Console.WriteLine(myBag.Item3) ' 出力:2010/06/17 9:43:33

    ' 【参考】型を確認
    Console.WriteLine(myBag.Item3.GetType())
    ' 出力:System.DateTime

    ' 【参考】次の行はコンパイル・エラーとなる
    ' Dim url As String = myBag.Item3
    ' error BC30512: Option Strict On で 'Date' から 'String' への暗黙の型変換はできません。

    ' 【参考】すべてを明示的に記述
    Dim myBag2 As Tuple(Of String, Integer, DateTime) _
      = Tuple.Create(Of String, Integer, DateTime) _
                              ("name", 42, DateTime.Now)

    ' 【参考】Tupleクラスのコンストラクタを使用
    Dim myBag3 = New Tuple(Of String, Integer, DateTime) _
                                ("name", 42, DateTime.Now)
  End Sub
End Class
Tupleクラスを使用したサンプル・プログラム(上:C#、下:VB)

 Tuple.Createメソッドの戻り値の型は、実際にはCreateメソッドのパラメータとして指定した各オブジェクトの型に従った、Tuple<T1, T2, T3>といったジェネリック型となるが( 参照)、コンパイラの推論機能により、通常は のように、C#では「var」、VBでは「Dim」を使って変数を宣言すればよい。

 Object型の配列の使用とは異なり、パラメータの型指定を省略した場合でも、Tupleオブジェクトに格納した項目についての型チェックはコンパイル時に行われる。End of Article

利用可能バージョン:.NET Framework 4以降
カテゴリ:クラス・ライブラリ 処理対象:コレクション
使用ライブラリ:Tupleクラス(System名前空間)

この記事と関連性の高い別の.NET TIPS
文字列で指定したメソッドを呼び出すには?
配列のサイズを変更するには?
ControlクラスのInvokeメソッドで匿名メソッドを使うには?
C#で配列を宣言するには?
レジストリの値のデータ型を判別するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


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 記事ランキング

本日 月間