오보에블로그

[C#API] 알아두면 유용한 IEnumerable 관련 메소드 본문

C++ & C#/C#

[C#API] 알아두면 유용한 IEnumerable 관련 메소드

(OBO) 2021. 12. 16. 21:39
728x90

Count

  • Count<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)
  • 해당 람다식에서 true를 반환하는 원소만 센다.

예시

List<int> numbers = new List<int>() {1,2,3,4,5,6,7,8};
int answer = numbers.Count(
    x =>
    {
        if (x % 2 == 1)
            return true;
        else
            return false;
    }
    );

Select

  • 해당 열거자에대해 다른 포맷으로 변경

예시

int[] numbers = {1,2,3,4,5,6,7 };
IEnumerable<int> query = numbers.Select((number, index) => { if (number % 2 == 0) return number; else return -1; });

IEnumerable<int> squares = Enumerable.Range(1, 10).Select(x => x * x);

TakeWhile

  • TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)
  • 해당 람다식을 참값으로 만족하고 있을때까지 0번째 원소부터 쭉 탐색해서 반환한다.

예시

  • 짝수를 만족할때 까지 쭉 반환하다가, 홀수인 1 을 만나고 false를 반환하여 그 전까지만 열거
int[] numbers = { 2, 4, 6, 12 , 0 , 1, 3, 9 };
IEnumerable<int> query = numbers.TakeWhile(number => (number % 2 == 0));
foreach (int number in query)
{
    Console.WriteLine(number); // 2 4 6 12 0
}

Where

  • Where<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) : 조건자에 따라 값의 시퀀스를 필터링합니다.
  • Where<TSource>(IEnumerable<TSource>, Func<TSource,Int32,Boolean>) : 원소 인덱스 값도 파라미터로 받을 수 있음

예시

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
IEnumerable<int> query = numbers.Where(number => number % 2 == 0);
foreach (int number in query)
{
    Console.WriteLine(number); // 2, 4, 6, 8, 10
}

Zip

  • Zip<TFirst,TSecond,TResult> (this System.Collections.Generic.IEnumerable<TFirst> first, System.Collections.Generic.IEnumerable<TSecond> second, Func<TFirst,TSecond,TResult> resultSelector);
  • 지정된 함수를 두 시퀀스의 해당 요소에 적용하여 결과 시퀀스를 만듭니다.
  • this IEnumerable<TFirst> first : 병합할 첫번째 시퀀스
  • IEnumerable<TSecond> second : 병합할 두번째 시퀀스
  • Func<TFirst, TSecond, TResult> resultSelector : 두 시퀀스의 요소를 병합하는 방법을 지정하는 함수

예시

int[] numbers = { 1, 2, 3, 4 };
string[] words = { "one", "two", "three" };

IEnumerable<string> numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second);

foreach (string item in numbersAndWords)
    Console.WriteLine(item);

// 1 one
// 2 two
// 3 three

Aggregate

  • Aggregate<TSource,TAccumulate,TResult>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate,TSource,TAccumulate>, Func<TAccumulate,TResult>) : 시퀀스에 누적기 함수 적용, 지정된 시드 값은 초기 누적값으로 사용 + 최종 리턴 값을 선택 가능
  • Aggregate<TSource,TAccumulate>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate,TSource,TAccumulate>) : 시퀀스에 누적기 함수 적용, 지정된 시드 값은 초기 누적값으로 사용
  • Aggregate<TSource>(IEnumerable<TSource>, Func<TSource,TSource,TSource>) : 시퀀스에 누적기 함수 적용

예시

// 초기 시드 값 : "banana" , longest 가 누적값 , 최종 반환값은 .ToUpper() 한 값
string longestName =
    fruits.Aggregate("banana",
                    (longest, next) =>
                        next.Length > longest.Length ? next : longest,
                    fruit => fruit.ToUpper());

string longestName =
    fruits.Aggregate("banana",
                    (longest, next) =>
                        next.Length > longest.Length ? next : longest);

string longestName =
    fruits.Aggregate((longest, next) =>
                        next.Length > longest.Length ? next : longest);
728x90

'C++ & C# > C#' 카테고리의 다른 글

[C#API] Comparison<T>  (0) 2021.12.30
[C#API] IEnumerator & IEnumerable  (0) 2021.12.16
[C# API] String Builder  (0) 2021.10.21
[c#] Longest Common Substring  (0) 2019.08.04
[c#] TimeOutException이 catch되지 않을때  (0) 2019.08.04