class Lambda
{
class Department
{
public int Id { get; set; }
public string Name { get; set; }
}
class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public int DeptId { get; set; }
public int Type { get; set; }
public List<Department> depts { get; set; }
}
static void Main(string[] args)
{
int[] intArray = new[] { 96, 92, 24, 12, 17, 70, 27, 78, 15, 20 };
string strResult = "";
//람다 구문(Lambda Expression) 은(x => x + 25) 의 형태로([인수] => [반환 값]) 으로 구성된 익명 함수
foreach (int element in intArray.Where(param => param >= 25))
{
strResult += element.ToString() + "," + " ";
}
strResult = strResult.TrimEnd(' ');
strResult = strResult.TrimEnd(',');
Console.WriteLine("Lambda Expression: {0}", strResult);
List<int> numbers = new List<int>();
for (int i = 1; i < 1000; i++)
{
numbers.Add(i);
}
//[C#] Tuple (튜플) Type 이란? (Tuples Enhancement)
//Tuple (튜플) 은 C# 7.0 에서 추가된 Type 입니다. Tuple (튜플) Type 을 통해서 두 개 이상의 값을 반환하는 메서드대한 가상 구조체
//이 형식은 NuGet 패키지로 System.ValueTuple 을 추가하시거나 .NET Framework를 4.7 이상의 버전을 설치하셔야 사용이 가능한 형식입니다.
//[Manage NuGet Packages for Solution… (솔루션용 Nuget 패키지 관리)] 화면에서 “ValueTuple “을 검색하신 후 [Install (설치)] 버튼을 클릭하여 [System.ValueTuple] 패키지를 설치합니다.
var range = Range(numbers);
Console.WriteLine($"Max: {range.Max}, Min: {range.Min}");
range = Range(range.Max, range.Min);
Console.WriteLine($"Max: {range.Max}, Min: {range.Min}");
(int max, int min) = Range(numbers);
Console.WriteLine($"Max: {max}, Min: {min}");
List<Department> departments = new List<Department>();
departments.Add(new Department { Id = 1, Name = "Account" });
departments.Add(new Department { Id = 2, Name = "Sales" });
departments.Add(new Department { Id = 3, Name = "Marketing" });
List<Employee> employees = new List<Employee>();
employees.Add(new Employee { DeptId = 0, Type = 2, Id = 1, Name = "William" });
employees.Add(new Employee { DeptId = 2, Type = 2, Id = 2, Name = "Miley" });
employees.Add(new Employee { DeptId = 1, Type = 1, Id = 3, Name = "Benjamin" });
//C# 6.0 Null-Conditional Operators (무효 조건 연산자)
int? length = employees?.Count; // employees가 null 일 경우 null 값을 반환합니다.
Employee first = employees?[0]; // employees가 null 일 경우 null 값을 반환합니다.
int? count = employees?[0]?.depts?.Count; // employees, employees[0], Orders 중 하나라도 null 일 경우 null 값을 반환합니다
Func<int, int, bool> testForEquality = (x, y) => x == y;
Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;
Func<(int i, int j), (int, int)> nums = ns => (ns.i+1, ns.j+1);
var numberssss = (123, 234);
var pnums = nums(numberssss);
Console.WriteLine(pnums);
Action<string> greet = name =>
{
string greeting = $"Hello {name}!";
Console.WriteLine(greeting);
};
greet("World");
//람다 식 및 튜플
Func<(int, int, int), (int, int, int)> doubleThem = ns => (2 * ns.Item1, 2 * ns.Item2, 2 * ns.Item3);
var numberss = (2, 3, 4);
var doubledNumbers = doubleThem(numberss);
Console.WriteLine($"The set {numberss} doubled: {doubledNumbers}");
Func<(int n1, int n2, int n3), (int, int, int)> doubleThems = ns => (2 * ns.n1, 2 * ns.n2, 2 * ns.n3);
var numbersss = (2, 3, 4);
var doubledNumberss = doubleThems(numbersss);
Console.WriteLine($"The set {numbersss} doubled: {doubledNumberss}");
Console.WriteLine("\n아무 키나 누르세요.");
Console.ReadKey();
}
public static string GetValue(string value, int length)
{
string result = value;
if (value != null) // 설명을 위해 빈 문자열 확인 과정은 생략합니다.
{
result = value.Substring(0, Math.Min(value.Length, length));
}
return result;
}
public static string GetValue6(string value, int length)
{
return value?.Substring(0, Math.Min(value.Length, length));
}
private static (int Max, int Min) Range(IEnumerable<int> numbers)
{
int min = int.MaxValue;
int max = int.MinValue;
foreach (var n in numbers)
{
min = (n < min) ? n : min;
max = (n > max) ? n : max;
}
return (max, min);
}
private static (int Max, int Min) Range(int i, int j)
{
int min = int.MaxValue;
int max = int.MinValue;
foreach (var n in new int[2]{ i, j })
{
min = (n < min) ? n : min;
max = (n > max) ? n : max;
}
return (max, min);
}
}