포슀트

πŸŒ’ C# Tuple

MS DOC 0
MS DOC 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
(int, int) t = (0, 1);
// t.ToString();
// Output: (0, 1)

// t.GetHashCode();

(double, int) t = (4.5, 3);
// t.Item1, t.Item2

(double Sum, int) t = (4.5, 3);
// t.Sum(=Item1), t.Item2

(double Sum, int Count) t = (4.5, 3);
// t.Sum(=Item1), t.Count(=Item2)

var t = (4.5, 3);
// t.Item1, t.Item2

var t = (Sum: 4.5, 3);
// t.Sum(=Item1), t.Item2

var t = (Sum: 4.5, Count: 3);  
// t.Sum(=Item1), t.Count(=Item2)

(double Sum, int Count) t = (Sum: 4.5, Count: 3);
// t.Sum, t.Count
// CS8123 : νŠœν”Œ μš”μ†Œ 이름 'Sum'은(λŠ”) λŒ€μƒ ν˜•μ‹ '(double Sum, int Count)'μ—μ„œ λ‹€λ₯Έ 이름이 μ§€μ •λ˜μ—ˆκ±°λ‚˜ 이름이 μ§€μ •λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— λ¬΄μ‹œλ©λ‹ˆλ‹€.

var sum = 4.5;
var count = 3;
var t = (sum, count);
Console.WriteLine($"Sum of {t.count} elements is {t.sum}.");
// Tuple Projection Initializer  
// Can't Projection : Tuple's Member Name(ToString, Rest, Item1, Item2...), Already Used

var t = 
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26);
// t.Item1 ~ t.Item26

컴파일 μ‹œκ°„μ— ν•„λ“œ 이름을 κΈ°λ³Έ μ΄λ¦„μœΌλ‘œ λ³€κ²½
= λͺ…μ‹œμ  지정, μœ μΆ”λœ ν•„λ“œ 이름 λŸ°νƒ€μž„ μ‚¬μš© λΆˆκ°€λŠ₯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var xs = new[] { 4, 7, 9 };
var limits = FindMinMax(xs);
Console.WriteLine($"Limits of [{string.Join(" ", xs)}] are {limits.min} and {limits.max}");
// Output:
// Limits of [4 7 9] are 4 and 9

var ys = new[] { -9, 0, 67, 100 };
var (minimum, maximum) = FindMinMax(ys);
Console.WriteLine($"Limits of [{string.Join(" ", ys)}] are {minimum} and {maximum}");
// Output:
// Limits of [-9 0 67 100] are -9 and 100

(int min, int max) FindMinMax(int[] input)
{
	if (input is null || input.Length == 0)
	{
		throw new ArgumentException("Cannot find minimum and maximum of a null or empty array.");
	}

	var min = int.MaxValue;
	var max = int.MinValue;
	foreach (var i in input)
	{
		if (i < min)
		{
			min = i;
		}
		if (i > max)
		{
			max = i;
		}
	}
	return (min, max);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// ν• λ‹Ή 및 λΆ„ν•΄

// 두 νŠœν”Œ ν˜•μ‹μ˜ μš”μ†Œ μˆ˜κ°€ 동일함
// AND
// 각 νŠœν”Œ μœ„μΉ˜μ—μ„œ 였λ₯Έμͺ½ νŠœν”Œ μš”μ†Œμ˜ ν˜•μ‹μ΄ ν•΄λ‹Ήν•˜λŠ” μ™Όμͺ½ νŠœν”Œ μš”μ†Œμ˜ ν˜•μ‹κ³Ό λ™μΌν•˜κ±°λ‚˜ ν•΄λ‹Ή ν˜•μ‹μœΌλ‘œ μ•”μ‹œμ μœΌλ‘œ λ³€ν™˜ κ°€λŠ₯함

(int, double) t1 = (17, 3.14);
(double First, double Second) t2 = (0.0, 1.0);
t2 = t1;
// t2.First, t2.Second

(double A, double B) t3 = (2.0, 3.0);
t3 = t2;
// t3.A, t3.B

// ν•„λ“œ 이름은 λ¬΄μ‹œλ˜κ³  ν• λ‹Ήλ˜μ§€ μ•ŠμŒ
// XXX : t3.First, t3.Second

// = λŒ€μž… μ—°μ‚°μžλ₯Ό μ΄μš©ν•œ νŠœν”Œ μΈμŠ€ν„΄μŠ€ κ°œλ³„ λ³€μˆ˜ λΆ„ν•΄

// λͺ…μ‹œμ  μ„ μ–Έ
var t = ("post office", 3.6);
(string destination, double distance) = t;
(string destination, var distance) = t;

// κ΄„ν˜Έλ°– var (ν˜•μ‹ν™”λœ λ³€μˆ˜λ₯Ό μ•”μ‹œμ  μ„ μ–Έ, μ»΄νŒŒμΌλŸ¬κ°€ μœ μΆ”)
var t = ("post office", 3.6);
var (destination, distance) = t;

// κΈ°μ‘΄ λ³€μˆ˜ μ‚¬μš©
var destination = string.Empty;
var distance = 0.0;
var t = ("post office", 3.6);
(destination, distance) = t;

// ν˜Όν•©  

// μ‚­μ œ (λ¬΄μ‹œ)
var (_, _, _, a, _, b) = ~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// νŠœν”Œ 비ꡐ  

Console.WriteLine((Display(1), Display(2)) == (Display(3), Display(4)));

int Display(int s)
{
	Console.WriteLine(s);
	return s;
}
// Output:
// 1
// 2
// 3
// 4
// False

// == 및 != μ—°μ‚°μžλŠ” 단락(short-circuiting) λ°©μ‹μœΌλ‘œ νŠœν”Œμ„ λΉ„κ΅ν•©λ‹ˆλ‹€. 즉, 같지 μ•Šμ€ μš”μ†Œ μŒμ„ μΆ©μ‘±ν•˜κ±°λ‚˜ νŠœν”Œμ˜ 끝에 λ„λ‹¬ν•˜λŠ” μ¦‰μ‹œ 연산이 μ€‘μ§€λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹€μŒ μ˜ˆμ œμ™€ 같이 λΉ„κ΅ν•˜κΈ° 전에 β€˜λͺ¨λ“ β€™ νŠœν”Œ μš”μ†Œκ°€ ν‰κ°€λ©λ‹ˆλ‹€.

1
2
3
4
5
6
7
8
// Deconstruct  

var p = new Person("John", "Quincy", "Adams", "Boston", "MA");

// Deconstruct the person object.
var (fName, lName, city, state) = p;
var (temp, _, _) = p;
이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.