자주 쓰는 컬렉션 집계함수들을 모아서 간단하게 사용법을 정리해보았다.
아래에서 사용한 함수는 아래와 같다.
0. Foreach
1. FindAll(찾기)
2. Except(차집합)
3. ToDictionary(사전화)
4. Select(골라내기)
5. Sum/Min/Average(집계)
6. Aggregate(누산)
7. Dictinct(중복 제거)
0. Foreach
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 | // 번호와 이름을 갖는 구조체 struct SchoolMember { public int UID; public string strName; } // 리스트를 출력하는 함수. public static void Print<T>( this List<T> lst ) { lst.ForEach( r => Console.Write( $"{r} " ) ); Console.WriteLine(); } // 리스트를 출력하는 함수. public static void Print( this List<SchoolMember> lst ) { lst.ForEach( r => Console.Write( $"{r.strName}({r.UID}) " ) ); Console.WriteLine(); } // 딕셔너리를 출력하는 함수. public static void Print( this Dictionary<int, string> dic ) { foreach ( var i in dic ) { Console.Write( $"{i.Value}({i.Key}) "); } Console.WriteLine(); } | cs |
본 예제를 위해서 간단하게 만든 친구들이다.
Print 함수에서 Linq의 Foreach가 사용 되었다.
Dictinary에서는 Foreach가 지원이 안되더라.. ㅠ
1 2 3 4 5 6 7 8 9 | // 0. SchoolMember를 만들어 놓는다. List<SchoolMember> lstSchoolMember = new List<SchoolMember>(); lstSchoolMember.Add( new SchoolMember { UID = 1, strName = "홍길동" } ); lstSchoolMember.Add( new SchoolMember { UID = 2, strName = "두루미" } ); lstSchoolMember.Add( new SchoolMember { UID = 3, strName = "김수한" } ); lstSchoolMember.Add( new SchoolMember { UID = 4, strName = "거북이" } ); lstSchoolMember.Add( new SchoolMember { UID = 5, strName = "삼천갑" } ); lstSchoolMember.Add( new SchoolMember { UID = 6, strName = "동방삭" } ); | cs |
그 후 샘플로 사용할 리스트를 채웠다.
1. FindAll
1 2 3 4 | // 1. 번호가 짝수인 친구만 찾아낸다. List<SchoolMember> lstEvenNumber = lstSchoolMember.FindAll( r => r.UID % 2 == 0 ); lstEvenNumber.Print(); // 결과 : 두루미(2) 거북이(4) 동방삭(6) | cs |
해당 컬렉션에서 조건을 만족하는 친구들을 모두 찾는(FindAll) 함수이다.
2. Except
1 2 3 4 | // 2. (1.)의 멤버를 제외한 친구들을 찾아낸다. List<SchoolMember> lstNotEvenNumber = lstSchoolMember.Except( lstEvenNumber ).ToList(); lstNotEvenNumber.Print(); // 결과 : 홍길동(1) 김수한(3) 삼천갑(5) | cs |
해당 컬렉션에 인자로 넣은 컬렉션의 차집합을 구하는 함수이다.
리턴값이 IEnumerable이라 List로 변환해줘야 한다.
3. ToDictionary
1 2 3 4 | // 2. (1.)의 멤버를 제외한 친구들을 찾아낸다. List<SchoolMember> lstNotEvenNumber = lstSchoolMember.Except( lstEvenNumber ).ToList(); lstNotEvenNumber.Print(); // 결과 : 홍길동(1) 김수한(3) 삼천갑(5) | cs |
List를 Dictionary로 변환시키는 함수이다.
첫째 인자에 Key, 둘째 인자에 Value를 만드는 방법을 넣으면 된다.
4. Select
1 2 3 4 | // 4. Dictionary<int, string>을 활용하여 새로운 List<string>를 만들어 낸다. List<string> lstSchoolMemberName = dicSchoolMember.Select( r => r.Value + r.Key.ToString() ).ToList(); // string + int.ToString()으로 새로운 string을 만듬. lstSchoolMemberName.Print(); // 결과 : 홍길동1 두루미2 김수한3 거북이4 삼천갑5 동방삭6 | cs |
해당 컬렉션을 가공해서 새로운 컬렉션으로 만드는 함수이다.
컬렉션을 복사할때도 사용 할 수 있다.
5. Sum/Min/Average
1 2 3 4 5 6 | // 5. 집계 함수를 이용해 간단한 내용을 집계한다. int iSum = lstSchoolMember.Sum( r => r.UID ); int iMin = lstSchoolMember.Min( r => r.UID ); double dAvg = lstSchoolMember.Average( r => r.UID ); Console.WriteLine( $"sum : {iSum}, min : {iMin}, avg : {dAvg}" ); // 결과 : sum : 21, min : 1, avg : 3.5 | cs |
제곧내
6. Aggregate
1 2 3 4 5 6 7 8 9 | // 6. 누산 함수를 이용해 짝수의 합을 집계한다. int iSumEvenNumber = lstSchoolMember.Aggregate( 0, ( sum, i ) => { if ( i.UID % 2 == 0 ) return sum + i.UID; else return sum; } ); Console.WriteLine( iSumEvenNumber ); // 결과 : 12 | cs |
집계 함수의 기본이 되는 듯한 함수이다.
이 함수를 사용해서 짝수의 합을 구하는 것 외에도 여러 복잡한 일을 편하게 할 수있다.
6-1. Aggregate 활용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | List<SchoolMember> lstSchoolMember = new List<SchoolMember>(); lstSchoolMember.Add( new SchoolMember { UID = 1, strName = "Aaa" } ); lstSchoolMember.Add( new SchoolMember { UID = 1, strName = "Bbb" } ); lstSchoolMember.Add( new SchoolMember { UID = 2, strName = "Ccc" } ); lstSchoolMember.Add( new SchoolMember { UID = 2, strName = "Bbb" } ); lstSchoolMember.Add( new SchoolMember { UID = 2, strName = "Aaa" } ); lstSchoolMember.Add( new SchoolMember { UID = 3, strName = "Ddd" } ); // 6-1. Aggregate를 사용하여 UID별로 사전순으로 빠른 name으로 덮어쓴 Dictinary<int, string>을 만든다. Dictionary<int, string> hsSchoolMember = lstSchoolMember.Aggregate( new Dictionary<int, string>(), ( retval, i ) => { // 이미 UID가 존재하고, 사전 전 순위라면 무시한다. if ( retval.ContainsKey( i.UID ) == true && retval[i.UID].CompareTo( i.strName ) < 1 ) { return retval; } // 아니라면 추가. retval[i.UID] = i.strName; return retval; } ); hsSchoolMember.Print(); // 결과 : Aaa(1) Aaa(2) Ddd(3) | cs |
Aggregate는 집계 함수의 기본이 되는 함수라서 위와 같이 대부분의 집계 행위를 하는데 편하게 할 수 있다.
7. Distinct
1 2 3 4 5 6 7 8 9 10 | // 7. 중복을 제거한다. List<int> lstNumber = new List<int>(); lstNumber.Add( 1 ); lstNumber.Add( 1 ); lstNumber.Add( 2 ); lstNumber.Add( 3 ); List<int> lstDistinctNumber = lstNumber.Distinct().ToList(); lstDistinctNumber.Print(); // 결과 : 1 2 3 | cs |
중복을 제거하는 집계함수이다.
가끔은 반복문 돌리는게 더 편한데 비효율적으로 사용하기도 하는 기능이지만,
잘 사용하면 정말 편하고 코드도 읽기 좋아지니까 자주 애용해야겠다.
'Programming > C# & Unity' 카테고리의 다른 글
C# 게임 서버 (.net core) 장단점 (4) | 2021.02.15 |
---|---|
C# try catch finally (0) | 2020.10.06 |
C# 4.0 쓸만한 기능 (0) | 2020.01.10 |
C# 비동기 루프 및 실행 (2) | 2019.12.12 |
C# ThreadLocal (0) | 2019.12.10 |