English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# Tuple(元組)

Tuple<T>クラスは.NET Framework4.0で導入された。タプルは、属性を持つオブジェクトを保存するデータ構造が必要であり、それに独自のタイプを作成したくない場合に使用できます。

文法:

Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>

以下の例では、3つの要素を含むタプルを作成します:

Tuple<int, string, string> person = new Tuple <int, string, string>(1, "Steve", "Jobs");

上記の例では、人間のレコードのインスタンスを含むタプルを作成しました。各要素に種類を指定し、コンストラクタに値を渡します。各要素の種類を指定することは煩雑です。C#は、各要素の種類を指定する必要がないTuple <T>のインスタンスを返却する静的ヘルパークラスTupleを導入しました。以下のようになります。

var person = Tuple.Create(1, "Steve", "Jobs");

タプルは最大で8つの要素を含むことができます。8以上の要素を含もうとすると、コンパイラエラーが発生します。

var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, 8);

タプル要素へのアクセス

タプル要素はItem < elementnumber > 属性を通じてアクセスできます、例えばItem1、 Item2、 Item3など、Item7属性。Item1属性は最初の要素を返却します、Item2返却第二个要素、それに続きます。最後の要素(第8要素)は、Rest属性を通じて返却されます。

var person = Tuple.Create(1, "Steve", "Jobs");
person.Item1; // 返却 1
person.Item2; // 返却 "Steve"
person.Item3; // 返却 "Jobs"
var numbers = Tuple.Create("One", 2, 3, "Four" 5, "Six" 7, 8);
numbers.Item1; // 返却 "One"
numbers.Item2; // 返却 2
numbers.Item3; // 返却 3
numbers.Item4; // 返却 "Four"
numbers.Item5; // 返却 5
numbers.Item6; // 返却 "Six"
numbers.Item7; // 返却 7
numbers.Rest; // 返却 (8)
numbers.Rest.Item1; // 返却 8

通常、第8の位置にタプルを使用すると、その位置にアクセスするためにRest属性を使用できます。

ネストされたタプル

タプルに8個以上の要素を含めたい場合、他のタプルオブジェクトを第八個要素としてネストすることができます。最後のネストされたタプルにアクセスするには、Rest属性を使用します。ネストされたタプルの要素にアクセスするには、Rest.Itemを使用してください。1.Item<elelementNumber>属性。

var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9, 10, 11, 12, 13));
numbers.Item1; // 返却 1
numbers.Item7; // 返却 7
numbers.Rest.Item1; //返却(8,9,10,11,12,13)
numbers.Rest.Item1.Item1; //返却 8
numbers.Rest.Item1.Item2; //返却 9

シーケンスのどこにでもネストされたタプルオブジェクトを含めることができます。ただし、Rest属性を使用してアクセスするために、ネストされたタプルをシーケンスの最後に配置することをお勧めします。

var numbers = Tuple.Create(1, 2, Tuple.Create(3, 4, 5, 6, 7,  8), 9, 10, 11, 12, 13 );
numbers.Item1; // 返却 1
numbers.Item2; // 返却 2
numbers.Item3; // 返却 (3, 4, 5, 6, 7,  8)
numbers.Item3.Item1; // 返却 3
numbers.Item4; // 返却 9
numbers.Rest.Item1; //返却13

タプルをメソッドパラメータとして使用

メソッドはタプルをパラメータとして受け取ることができます。

static void Main(string[] args)
{    var person = Tuple.Create(1, "Steve", "Jobs");
    DisplayTuple(person);
}
static void DisplayTuple(Tuple<int,string,string> person)
{
    Console.WriteLine($"Id = { person.Item1});
    Console.WriteLine($"First Name = { person.Item2});
    Console.WriteLine($"Last Name = { person.Item3});
}

タプルを返却型として使用

タプルはメソッドから返すことができます。

static void Main(string[] args)
{    var person = GetPerson();
}
static Tuple<int, string, string> GetPerson() 
{    return Tuple.Create(1, "Bill", "Gates");
}

タプルの使い方

タプルは以下の状況で使用できます:

  1. メソッドから複数の値を返す必要があるが、refやoutパラメータを使用しない場合。

  2. メソッドに複数の値を単一の引数として渡したい場合。

  3. データベースのレコードや特定の値を一時的に保存したい場合、または独立したクラスを作成しない場合。。

元組の欠点:

  1. Tupleは参照型であり、値型ではありません。ヒープ上に割り当てられ、CPU集約型操作を引き起こす可能性があります。

  2. Tupleは8つの要素に制限されています。もっと要素を保存する必要がある場合は、ネストされた元組を使用する必要がありますが、これにより混乱が生じる可能性があります。

  3. 属性アクセスには名前パターン Item <elementNumber> を使用できますが、これは理にかなっていません。

C#7ValueTupleを使用してTupleの制約を克服し、Tupleの使用をより簡単にする。次の章でそれについて学びます。