Enumerator

콜렉션을 열거자를 통하여 접근하는 방법에 대해서 알아보자.

IEnumerator


IEnumerator를 사용하기 위해 다음 라인을 추가한다.

using System.Collections;

MoveNext : 열거자를 컬렉션의 다음 요소로 이동한다.
Reset : 컬렉션의 첫 번째 요소 앞의 초기 위치에 열거자를 설정한다.

최초의 위치는 컬렉션의 첫 번째 요소 앞이다.

스트링에는 IEnumerable 인터페이스가 구현되어있다.

using System;
using System.Collections;

namespace csharpTest
{
    class Test
    {
        public Test()
        {
            string[] strList = { "one", "two", "three", "four", "five" };

            IEnumerator e = strList.GetEnumerator();

            while (e.MoveNext())
            {
                Console.WriteLine(e.Current);
            }

            Console.WriteLine("--------------------------");

            e.Reset();
            e.MoveNext();
            Console.WriteLine(e.Current);       
        }
    }
}

결과
one
two
three
four
five
--------------------------
one

IEnumerable


IEnumerable을 사용하기 위해 다음 라인을 추가한다.

using System.Collections.Generic;

제네릭이 아닌 컬렉션에서 단순하게 반복할 수 있도록 지원하는 열거자를 노출한다.

using System;
using System.Collections.Generic;

namespace csharpTest
{
    class People
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class Test
    {
        public Test()
        {
            IEnumerable<People> peopleList = new People[]
            {
                new People { Name = "kim", Age = 20},
                new People { Name = "lee", Age = 20},
                new People { Name = "park", Age = 15},
                new People { Name = "wang", Age = 15}
            };

            foreach (var value in peopleList)
            {
                Console.WriteLine(value.Name + ", " + value.Age);
            }
        }
    }
}

결과

kim, 20
lee, 20
park, 15
wang, 15


IEnumerable에서 쿼리 질의


IEnumerable 리스트를 이용하여 Sql 문처럼 질의 할수 있다.
C#에서는 Linq 문이라고 한다.

Linq를 사용할려면 다음 라인을 추가한다.

using System.Collections.Generic;
using System.Linq;

SQL Query문과 Linq문은 비슷하다.

SQL Query문
select (column)  from (table) where (조건)

Linq Query문
from (리스트아이템) in (리스트) where 조건 select (리턴값)

예제1) 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;

namespace csharpTest
{
    class People
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class Test
    {
        public Test()
        {
            IEnumerable<People> peopleList = new People[]
            {
                new People { Name = "kim", Age = 20},
                new People { Name = "lee", Age = 20},
                new People { Name = "park", Age = 15},
                new People { Name = "wang", Age = 15}
            };

            var query = from p in peopleList
                        where p.Age == 20
                        select p;

            foreach (var value in query)
            {
                Console.WriteLine(value.Name + ", " + value.Age);
            }
        }
    }
}

예제1) 결과
kim, 20
lee, 20

"select p" 대신 "select p.Name"을 사용하면 Name 문자열을 query에 리턴한다.

예제2) 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;

namespace csharpTest
{

    class Test
    {
        public Test()
        {
            string[] strList = { "one", "two", "three", "four", "five" };

            //IEnumerable<string> enumerable = strList.Where(str => str.Length <= 3);
            IEnumerable<string> enumerable = from str in strList where str.Length <= 3 select str;


            IEnumerator<string> e = enumerable.GetEnumerator();

            while (e.MoveNext())
            {
                Console.WriteLine(e.Current);
            }

        }
    }
}

예제2) 결과
one
two


Enumerable.Range 메소드

지정된 범위내의 정수 시퀀스를 생성한다.

IEnumerable<int> squares = Enumerable.Range(1, 10)
1부터 10까지 squares에 채운다

using System.Collections.Generic;
using System.Linq;

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

foreach (int num in squares)
{
    Console.WriteLine(num);
}

Select(x => x * x) 문을 이용하여 1, 4, 9, 16, 25, 36, 49, 64, 81, 100을 squares에 채우고 있다.

Enumerable.Range 값을 배열로 변환하여 넣을수도 있다.

using System.Collections.Generic;
using System.Linq;

//int[] squares = Enumerable.Range(1, 10).ToArray<int>();

var squares = Enumerable.Range(1, 10).ToArray();
            
foreach (int num in squares)
{
    Console.WriteLine(num);
}


참조)
IEnumerable  사용법
http://www.dotnetperls.com/ienumerable

IEnumerable  인터페이스
https://msdn.microsoft.com/ko-kr/library/system.collections.ienumerable(v=vs.110).aspx

IEnumerable(Linq) 예제
http://j07051.tistory.com/577

Linq] C# Linq - 기본 구문   SQL 문
http://herbyoung.tistory.com/45