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>

下面的示例创建一个包含三个元素的元组:

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

在上面的示例中,我们创建了一个Tuple包含一个人的记录的实例。我们为每个元素指定一种类型,并将值传递给构造函数。指定每个元素的类型很麻烦。C#引入了一个静态帮助器类Tuple,,该类返回Tuple <T>的实例,而不必指定每个元素的类型,如下所示。

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

一个元组最多只能包含八个元素。当您尝试包含八个以上的元素时,它将产生编译器错误。

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개 이상의 요소를 포함하려면, 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.Item"1
});
    Console.WriteLine($"First Name = { person.Item"2
});
    Console.WriteLine($"Last Name = { person.Item"3
});
}

튜플로서 반환 타입

튜플은 메서드에서 반환될 수 있습니다.

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. Tuple 요소에 대한 이름 패턴 Item <elementNumber>의 프로퍼티를 사용하여 접근할 수 있습니다. 이는 매우 불합리합니다.

C#7ValueTuple을 도입하여 Tuple의 제한을 극복하고 Tuple 사용을 더 쉽게 만들었습니다. 다음 장에서 이를 알아보겠습니다.