■ Enumerable 클래스의 Cast<T> 확장 메소드를 사용하는 방법을 보여준다. ▶ Program.cs
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 43
|
using System; using System.Collections; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { ArrayList arrayList = new ArrayList(); arrayList.AddRange(new object[] { 1, 2, 3, 4, 5 }); var resultEnumerable = arrayList.Cast<int>(); //IEnumerable<int> 타입으로 변환한다. foreach(var result in resultEnumerable) { Console.Write(".." + result); } Console.WriteLine(); Console.WriteLine(); } #endregion } } |
※ arrayList에 int 타입이 아닌 다른 타입의 요소가 포함된 경우
더 읽기
■ Enumerable 클래스의 OfType<T> 확장 메소드를 사용해 특정 타입의 요소를 구하는 방법을 보여준다. ▶ Program.cs
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 43 44
|
using System; using System.Collections; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { ArrayList arrayList = new ArrayList(); arrayList.AddRange(new object[] { 1, 2, "MAX", 3, 4, "MIN", 5 , "AVERAGE" }); var resultEnumerable = arrayList.OfType<int>(); Console.WriteLine("문자열 항목만 추출한다."); foreach(var result in resultEnumerable) { Console.Write(".." + result); } Console.WriteLine(); Console.WriteLine(); } #endregion } } |
■ Enumerable 클래스의 Union<T> 확장 메소드를 사용해 데이터의 합집합을 구하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
using System; using System.Collections.Generic; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { int[] integerArray1 = { 1, 2, 3, 4, 5, 6 }; Console.WriteLine("정수 배열 1"); foreach(int i in integerArray1) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); int[] integerArray2 = { 3, 4, 5, 6, 7, 8 }; Console.WriteLine("정수 배열 2"); foreach(int i in integerArray2) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); IEnumerable<int> resultEnmuerable = integerArray1.Union(integerArray2); Console.WriteLine("정수 배열 1과 정수 배열 2의 합집합"); foreach(int i in resultEnmuerable) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); } #endregion } } |
■ Enumerable 클래스의 Concat<T> 확장 메소드를 사용해 배열을 병합하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
namespace TestProject; /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { int[] sourceArray1 = { 1, 2, 3, 4, 5, 6 }; Console.WriteLine("소스 배열 1"); foreach(int i in sourceArray1) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); int[] sourceArray2 = { 3, 4, 5, 6, 7, 8 }; Console.WriteLine("소스 배열 2"); foreach(int i in sourceArray2) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); int[] targetArray = sourceArray1.Concat(sourceArray2).ToArray(); Console.WriteLine("소스 배열 1 + 소스 배열 2"); foreach(int i in targetArray) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); } #endregion } |
■ Enumerable 클래스의 Except<T> 확장 메소드를 사용해 데이터의 차집합을 구하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { int[] integerArray1 = { 1, 2, 3, 4, 5, 6 }; Console.WriteLine("정수 배열 1"); foreach(int i in integerArray1) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); int[] integerArray2 = { 3, 4, 5, 6, 7, 8 }; Console.WriteLine("정수 배열 2"); foreach(int i in integerArray2) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); IEnumerable<int> resultEnmuerable1 = integerArray1.Except(integerArray2); Console.WriteLine("차집합 : 정수 배열 1 - 정수 배열 2"); foreach(int i in resultEnmuerable1) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); IEnumerable<int> resultEnmuerable2 = integerArray2.Except(integerArray1); Console.WriteLine("차집합 : 정수 배열 2 - 정수 배열 1"); foreach(int i in resultEnmuerable2) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); } #endregion } } |
■ Enumerable 클래스의 Intersect<T> 확장 메소드를 사용해 데이터의 교집합을 구하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { int[] integerArray1 = { 1, 2, 3, 4, 5, 6 }; Console.WriteLine("정수 배열 1"); foreach(int i in integerArray1) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); int[] integerArray2 = { 3, 4, 5, 6, 7, 8 }; Console.WriteLine("정수 배열 2"); foreach(int i in integerArray2) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); Console.WriteLine("정수 배열 1과 정수 배열 2의 교집합"); var resultEnumerable = integerArray1.Intersect(integerArray2); foreach(int i in resultEnumerable) { Console.Write(".." + i); } Console.WriteLine(); Console.WriteLine(); } #endregion } } |
■ group … by 키워드 질의 형식을 사용해 그룹 목록을 구하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48 49
|
using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { // 파일 경로 리스트를 설정한다. IEnumerable<string> filePathList = Directory.EnumerateFiles ( "d:\\", "*.*", SearchOption.AllDirectories ); // 파일 경로의 첫번째 문자로 그룹 목록(IEnumerable<IGrouping<string, string>>)을 구한다. var resultEnumerable = from filePath in filePathList group filePath by Path.GetFileName(filePath)[0].ToString() into g orderby g.Key select g; // 결과를 출력한다. foreach(var result in resultEnumerable) { Console.WriteLine("파일 경로 시작 문자 : " + result.Key); } } #endregion } } |
■ Enumerable 클래스의 OrderBy<TSource, TKey> 확장 메소드에서 IComparer<T> 인터페이스를 사용해서 정렬하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48
|
using System; using System.Collections.Generic; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { // 소스 리스트를 설정한다. List<string> sourceList = new List<string>() { "Blair" , "Lane" , "Jessie", "Aiden", "Reggie", "Tanner", "Maddox", "Kerry" }; // 마지막 문자 비교자를 사용해 정렬한다. IEnumerable<string> resultEnumerable = sourceList.OrderBy ( source => source, new LastCharacterComparer() ); // 결과를 출력한다. foreach(var result in resultEnumerable) { Console.WriteLine(result); } } #endregion } } |
▶ LastCharacterComparer.cs
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
|
using System.Collections.Generic; namespace TestProject { /// <summary> /// 마지막 문자 비교자 /// </summary> public class LastCharacterComparer : IComparer<string> { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 비교하기 - Compare(source1, source2) /// <summary> /// 비교하기 /// </summary> /// <param name="source1">소스 문자열 1</param> /// <param name="source2">소스 문자열 2</param> /// <returns>비교 결과</returns> public int Compare(string source1, string source2) { return string.Compare ( source1[source1.Length - 1].ToString(), source2[source2.Length - 1].ToString() ); } #endregion } } |
■ Enumerable 클래스의 GroupBy<TSource, TKey> 확장 메소드를 사용해 그룹 목록을 구하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46
|
using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { // 파일 경로 리스트를 설정한다. IEnumerable<string> filePathList = Directory.EnumerateFiles ( "d:\\", "*.*", SearchOption.AllDirectories ); // 파일 경로의 첫번째 문자로 그룹 목록(IEnumerable<IGrouping<string, string>>)을 구한다. var resultEnumerable = filePathList.GroupBy(filePath => Path.GetFileName(filePath)[0].ToString()); // 결과를 출력한다. foreach(var result in resultEnumerable) { Console.WriteLine("파일 경로 시작 문자 : " + result.Key); } } #endregion } } |
■ Enumerable 클래스의 Join<TOuter, TInner, TKey, TResult> 확장 메소드를 사용하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
using System; using System.Collections.Generic; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { // 강의 리스트를 설정한다. Course korean = new Course{ Title = "국어", HourCount = 3 }; Course english = new Course{ Title = "영어", HourCount = 3 }; Course mathematics = new Course{ Title = "수학", HourCount = 2 }; Course science = new Course{ Title = "과학", HourCount = 3 }; List<Course> courseList = new List<Course> { english, mathematics, science, korean }; // 학생 리스트를 설정한다. Student student1 = new Student { Name = "김철수", Course = science }; Student student2 = new Student { Name = "이영희", Course = korean }; Student student3 = new Student { Name = "홍길동", Course = english }; Student student4 = new Student { Name = "김지수", Course = science }; Student student5 = new Student { Name = "서지영", Course = english }; Student student6 = new Student { Name = "김지훈", Course = mathematics}; List<Student> studentList = new List<Student> { student1, student2, student3, student4, student5, student6 }; // 학생 리스트와 강의 리스트를 조인한다. var resultEnumerable = studentList.Join ( courseList, student => student.Course, course => course, (student, course) => new { StudentName = student.Name, CourseTitle = course.Title } ); // 결과를 출력한다. foreach(var result in resultEnumerable) { Console.WriteLine($"{result.StudentName} - {result.CourseTitle}"); } } #endregion } } |
▶ Course.cs
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
|
namespace TestProject { /// <summary> /// 강의 /// </summary> public class Course { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 강의 제목 - Title /// <summary> /// 강의 제목 /// </summary> public string Title { get; set; } #endregion #region 강의 시간 - HourCount /// <summary> /// 강의 시간 /// </summary> public int HourCount { get; set; } #endregion } } |
▶ Student.cs
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
|
namespace TestProject { /// <summary> /// 학생 /// </summary> public class Student { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 성명 - Name /// <summary> /// 성명 /// </summary> public string Name { get; set; } #endregion #region 강의 - Course /// <summary> /// 강의 /// </summary> public Course Course { get; set; } #endregion } } |
■ Enumerable 클래스의 SelectMany<TSource, TResult> 확장 메소드를 사용해 데이터를 조합하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48 49 50 51 52
|
using System; using System.Collections.Generic; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { // 문자열 리스트를 설정한다. List<string> stringList = new List<string> { "서울", "부산" }; // 정수 리스트를 설정한다. List<int> integerList = new List<int> { 6, 12, 18, 24 }; // 문자열과 정수를 조합한다. IEnumerable<ValueItem> resultEnumerable = stringList.SelectMany ( stringValue => integerList, (stringValue, integerValue) => new ValueItem { StringValue = stringValue, IntegerValue = integerValue } ); // 결과를 출력한다. foreach(var result in resultEnumerable) { Console.WriteLine($"{result.StringValue} - {result.IntegerValue}"); } } #endregion } } |
▶ ValueItem.cs
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
|
namespace TestProject { /// <summary> /// 값 항목 /// </summary> public class ValueItem { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 문자열 값 - StringValue /// <summary> /// 문자열 값 /// </summary> public string StringValue { get; set; } #endregion #region 정수 값 - IntegerValue /// <summary> /// 정수 값 /// </summary> public int IntegerValue { get; set; } #endregion } } |
■ Enumerable 클래스의 Range 정적 메소드를 사용해 특정 범위의 정수 열거 가능 목록을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System; using System.Collections.Generic; using System.Linq; IEnumerable<int> sourceEnumerable = Enumerable.Range(1, 10); foreach(var item in sourceEnumerable) { Console.WriteLine(item); } |
■ Enumerable 클래스의 Where<T> 정적 메소드를 사용해 조건을 충족하는 열거 가능형 목록을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
using System.Collections.Generic; using System.Linq; ... private int[] sourceArray = { 0, 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, 43, 44, 45, 46, 47, 48, 49 }; ... IEnumerable<int> targetEnumerable = Enumerable.Where(this.sourceArray, i => i % 2 == 0); |
■ 함수형 확장을 사용하는 방법을 보여준다. ▶ 예제 코드 (C#)
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 43 44 45 46 47 48 49
|
using System; /// <summary> /// 함수형 확장 /// </summary> public static class FunctionalExtension { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 함수 실행하기 - ExecuteFunction<TSource, TResult>(source, function) /// <summary> /// 함수 실행하기 /// </summary> /// <typeparam name="TSource">소스 타입</typeparam> /// <typeparam name="TResult">결과 타입</typeparam> /// <param name="source">소스</param> /// <param name="function">함수</param> /// <returns>결과</returns> public static TResult ExecuteFunction<TSource, TResult> ( this TSource source, Func<TSource, TResult> function ) => function(source); #endregion #region 액션 실행하기 - ExecuteAction<TSource>(source, action) /// <summary> /// 액션 실행하기 /// </summary> /// <typeparam name="TSource">소스 타입</typeparam> /// <param name="source">소스</param> /// <param name="action">액션</param> /// <returns>소스</returns> public static TSource ExecuteAction<TSource>(this TSource source, Action<TSource> action) { action(source); return source; } #endregion } |
■ Enumerable 클래스의 Aggregate<T> 확장 메소드를 사용해 팩토리얼을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System; using System.Linq; int[] sourceArray = { 5, 4, 3, 2, 1 }; int result = sourceArray.Aggregate((result, value) => result * value); Console.WriteLine(result); /* 120 */ |
■ Enumerable 클래스의 Aggregate<T> 확장 메소드를 사용해 문자열을 결합하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
using System; using System.Linq; string[] sourceArray = { "광주", "대구", "대전", "부산", "서울", "인천" }; string result = sourceArray.Aggregate((result, value) => result + ", " + value); Console.WriteLine(result); /* 광주, 대구, 대전, 부산, 서울, 인천 */ |
■ 객체 리스트를 필터링하는 방법을 보여준다. ▶ 객체 리스트 필터링 하기 예제 (C#)
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
|
using System; using System.Collections.Generic; using System.Linq; List<Student> studentList = new List<Student> { new Student { Name = "강동구", Age = 70 }, new Student { Name = "강남구", Age = 60 }, new Student { Name = "강서구", Age = 50 }, new Student { Name = "홍길동", Age = 20 }, new Student { Name = "김철수", Age = 40 }, new Student { Name = "김영희", Age = 30 } }; List<Filter> filterList = new List<Filter> { new Filter { PropertyName = "Name", OperationType = OperationType.StartsWith , Value = "강" }, new Filter { PropertyName = "Age" , OperationType = OperationType.GreaterThan, Value = 50 } }; var expression = ExpressionBuilder.GetExpression<Student>(filterList).Compile(); var result = studentList.Where(expression); foreach(Student student in result) { Console.WriteLine(student.Name); } |
▶ OperationType.cs
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 43 44 45 46 47 48 49 50
|
namespace TestProject { /// <summary> /// 연산 타입 /// </summary> public enum OperationType { /// <summary> /// 작다. /// </summary> LessThan, /// <summary> /// 작거나 같다. /// </summary> LessThanOrEqual, /// <summary> /// 같다. /// </summary> Equals, /// <summary> /// 크거나 같다. /// </summary> GreaterThanOrEqual, /// <summary> /// 크다. /// </summary> GreaterThan, /// <summary> /// 포함한다. /// </summary> Contains, /// <summary> /// 시작한다. /// </summary> StartsWith, /// <summary> /// 끝난다. /// </summary> EndsWith } } |
▶ Filter.cs
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
|
namespace TestProject { /// <summary> /// 필터 /// </summary> public class Filter { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 속성명 - PropertyName /// <summary> /// 속성명 /// </summary> public string PropertyName { get; set; } #endregion #region 연산 타입 - OperationType /// <summary> /// 연산 타입 /// </summary> public OperationType OperationType { get; set; } #endregion #region 값 - Value /// <summary> /// 값 /// </summary> public object Value { get; set; } #endregion } } |
▶ ExpressionBuilder.cs
더 읽기
■ ParallelEnumerable 클래스의 AsParallel<TSource> 확장 메소드를 사용하는 방법을 보여준다. ▶ 예제 코드 (C#)
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 43 44 45 46 47 48 49 50 51 52 53
|
using System; using System.Collections.Generic; using System.Linq; /// <summary> /// 학생 /// </summary> public class Student { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 성명 - Name /// <summary> /// 성명 /// </summary> public string Name { get; set; } #endregion #region 연령 - Age /// <summary> /// 연령 /// </summary> public int Age { get; set; } #endregion } ... Random random = new Random(); List<Student> studentList = new List<Student>(); for(int i = 0; i < 1000000; i++) { Student student = new Student(); student.Name = string.Format("성명 {0}", i +1); student.Age = random.Next(0, 100); studentList.Add(student); } var result = from student in studentList.AsParallel() where student.Age > 50 orderby student.Age ascending select student; |
※ AsParallel 메소드 추가만으로 PLINQ가 적용된다. ※ 단순
더 읽기
■ 날짜 문자열을 갖는 속성 값을 검색하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
using System; using System.Linq; var itemArray = new[] { new { Name = "A", StartDate = "20151210", EndDate = "20151231"}, new { Name = "B", StartDate = "20151201", EndDate = "20151231"}, new { Name = "C", StartDate = "20151207", EndDate = "20151208"}, new { Name = "D", StartDate = "20151217", EndDate = "20151231"}, new { Name = "E", StartDate = "20151203", EndDate = "20151210"} }; var baseDate = "20151210"; var result = itemArray.Where(item => item.StartDate.CompareTo(baseDate) <= 0 && item.EndDate.CompareTo(baseDate) >= 0); foreach(var item in result) { Console.WriteLine(item); } |
■ Enumerable 클래스의 GroupBy<TSource, TKey> 확장 메소드를 사용해 객체 컬렉션에서 특정 객체 속성 값의 집합을 구하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48
|
using System; using System.Collections.ObjectModel; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> public class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { ObservableCollection<Employee> collection = Employee.GetCollection(); string[] propertyNameArray = new string[] { "ID", "Sex" }; var result = collection.AsEnumerable() .GroupBy(item => new Tuple<object>(from propertyName in propertyNameArray select item.GetType() .GetProperty(propertyName).GetValue(item))); foreach(var group in result) { foreach(var keyValue in group.Key.ValueArray) { Console.Write(keyValue); Console.Write(":"); } Console.WriteLine(); } } #endregion } } |
▶
더 읽기
■ Enumerable 클래스의 GroupBy<TSource, TKey> 확장 메소드를 사용해 객체 컬렉션에서 특정 객체 속성 값의 집합을 구하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48 49
|
using System; using System.ComponentModel; using System.Collections.ObjectModel; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> public class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { ObservableCollection<Employee> collection = Employee.GetCollection(); Employee employee = collection.FirstOrDefault(); if(employee != null) { PropertyDescriptorCollection propertyDescriptorCollection = TypeDescriptor.GetProperties(employee); PropertyDescriptor propertyDescriptor = propertyDescriptorCollection["Sex"]; var result = collection.GroupBy(p => propertyDescriptor.GetValue(p)) .Select(p => p.FirstOrDefault()) .OrderBy(p => propertyDescriptor.GetValue(p)); foreach(var item in result) { Console.WriteLine((item as Employee).Sex); } } } #endregion } } |
▶
더 읽기
■ group … by new { … } 키워드 질의 형식을 사용해 객체 컬렉션 특정 객체 속성 값의 집합을 구하는 방법을 보여준다.
더 읽기
■ Expression 클래스를 사용해 객체 컬렉션 특정 객체 속성 값의 집합을 구하는 방법을 보여준다. (속성 1개만 지정) ▶ Program.cs
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 43 44 45 46 47 48 49 50 51 52 53 54 55
|
using System; using System.ComponentModel; using System.Collections.ObjectModel; using System.Linq; using System.Linq.Expressions; namespace TestProject { /// <summary> /// 프로그램 /// </summary> public class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { ObservableCollection<Employee> collection = Employee.GetCollection(); string propertyName = "Sex"; ParameterExpression parameterExpression = Expression.Parameter(typeof(Employee), "p"); MemberExpression memberExpression = Expression.Property(parameterExpression, propertyName); LambdaExpression lambdaExpression = Expression.Lambda(memberExpression, parameterExpression); Delegate function = lambdaExpression.Compile(); var result = ( from item in collection group item by function.DynamicInvoke(item) into group1 select group1.First().GetType().GetProperty(propertyName).GetValue(group1.First()).ToString() into group2 orderby group2 select group2 ).ToList(); foreach(var item in result) { Console.WriteLine(item); } } #endregion } } |
▶ Employee.cs
더 읽기
■ group … by .. 키워드 질의 형식을 사용해 객체 컬렉션 특정 속성 값의 집합을 구하는 방법을 보여준다. ▶ Program.cs
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 43 44 45 46 47 48 49
|
using System; using System.ComponentModel; using System.Collections.ObjectModel; using System.Linq; namespace TestProject { /// <summary> /// 프로그램 /// </summary> public class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { ObservableCollection<Employee> collection = Employee.GetCollection(); Employee employee = collection.FirstOrDefault(); if(employee != null) { PropertyDescriptorCollection propertyDescriptorCollection = TypeDescriptor.GetProperties(employee); PropertyDescriptor propertyDescriptor = propertyDescriptorCollection["Sex"]; var result = from item in collection orderby propertyDescriptor.GetValue(item) group item by propertyDescriptor.GetValue(item); foreach(var group in result) { Console.WriteLine(group.Key); } } } #endregion } } |
▶
더 읽기
■ Enumerable 클래스의 Select<TSource, TResult> 확장 메소드를 사용하는 방법을 보여준다. ▶ 예제 코드 (C#)
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
using System; using System.Collections.Generic; using System.Linq; /// <summary> /// 임직원 /// </summary> class Employee { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 성명 - Name /// <summary> /// 성명 /// </summary> public string Name { get; set; } #endregion #region 부서 - Department /// <summary> /// 부서 /// </summary> public string Department { get; set; } #endregion #region 취미 배열 - HobbyArray /// <summary> /// 취미 배열 /// </summary> public string[] HobbyArray { get; set; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 임직원 리스트 구하기 - GetEmployeeList() /// <summary> /// 임직원 리스트 구하기 /// </summary> /// <returns>임직원 리스트</returns> public static List<Employee> GetEmployeeList() { List<Employee> employeeList = new List<Employee> { new Employee { Name = "홍길동", Department = "영업부" , HobbyArray = new string[] { "게임", "독서" }}, new Employee { Name = "황희" , Department = "경리부" , HobbyArray = new string[] { "수영", "영화감상" }}, new Employee { Name = "정약용", Department = "신사업기획부", HobbyArray = new string[] { "등산", "DIY" }} }; return employeeList; } #endregion } ... List<Employee> employeeList = Employee.GetEmployeeList(); var result = employeeList.Select(employee => employee.HobbyArray); foreach(string[] hobbyArray in result) { foreach(string hobby in hobbyArray) { Console.WriteLine(hobby); } } /* 게임 독서 수영 영화감상 등산 DIY */ |