C \ # 함수 식 프로 그래 밍 의 타성 목록 도구 - 교체 기

6145 단어 프로 그래 밍
데 이 터 를 효과적으로 처리 할 때 현재 프로 그래 밍 언어 와 프레임 워 크 의 작업NET 는 교체 기의 기능 을 이용 하여 데이터 에 대한 순서 적 인 접근 을 실현 하 는 정성 들 여 구 축 된 집합 시스템 을 가지 고 있다.
타성 매 거 는 교체 방법 으로 그 핵심 사상 은 필요 할 때 만 데 이 터 를 읽 는 것 이다.이 사상 은 모든 교체 알고리즘 이 매우 효과 적 이 고 수요 에 따라 임의의 데 이 터 를 유연 하 게 읽 을 수 있 으 며 과도 한 비용 을 초래 하지 않 을 것 을 보장 한다.
C \ # 함수 식 프로 그래 밍 의 매개 요소
. NET 집합 형식의 기 초 는 IEnumberable 이라는 인터페이스 입 니 다. 다음은 이 인터페이스의 성명 입 니 다.
public interface IEnumerable

{

    IEnumerator GetEnumerator();

}


실제로 IEnumberable 인 터 페 이 스 는 프로그래머 가 한 가지 일 만 할 수 있 습 니 다. 검색 류 의 다른 인터페이스 IEnumerator:
public interface IEnumerator

{

     object Current { get; }

     bool MoveNext();

     void Reset();

}


다음 클래스 는 사실상 IEnumberable 과 IEnumerator 인터페이스 성명 에 따 른 교체 모델 의 가장 간단 한 실현 형식 입 니 다.
public class EndlessListWithoutInterfaces

{

    public EndlessListWithoutInterfaces GetEnumerator()

    {

         return this;

    }



    public bool NoveNext()

    {

         return true;

     }



    public object Current

    {

         get

         { return "Something"; }

     }

}


EndlessList Without Interfaces 클래스 에서 도 C \ # 의 foreach 구 조 를 사용 할 수 있 습 니 다:
var list = new EndlessListWithoutInterfaces();

foreach (var item in list)

{

     Console.WriteLine(item);

}


이 실현 은 매우 기본 적 이기 때문에 무한 순환 을 초래 할 것 이다.
다음은 EndlessList 류 의 실현 입 니 다. 이 종 류 는 IEnumerator 와 IEnumberable 두 가지 종 류 를 사용 합 니 다. 이 두 가지 종 류 는 서로 끼 워 넣 을 필요 가 없습니다. 비록 내부 에 끼 워 넣 을 필요 가 없 지만.그러나 실제 IEnumberable 클래스 에 IEnumerator 클래스 를 끼 워 넣 는 것 은 흔 한 모드 입 니 다.
    public class EndlessList:IEnumerable

    {

        public class Enumerator:IEnumerator

        {

            int val = -1;



            public object Current

            {

                get

                { return val; }

            }



            public bool NoveNext()

            {

                val++;

                return true;

            }



            public void Reset()

            {

                val = -1;

            }

        }



        public IEnumerator GetEnumerator()

        {

            return new Enumerator();

        }

    }


값 서열 의 이런 실현 모델 은 매우 유연 하고 기능 도 강하 다.
C \ # 함수 식 프로 그래 밍 의 교체 기 함수 의 실현
C \ # 2.0 버 전에 교체 기 가 도입 되 었 습 니 다.이것 은 프로그래머 가 IEnumerator / IEnumberable 조합의 실현 을 만 들 수 있 도록 허용 하 며, 그 중의 임의의 인 터 페 이 스 를 수 동 으로 실현 할 필요 가 없다.비 범용 인 터 페 이 스 를 지원 하 는 것 외 에 범용 인터페이스 도 지원 하기 때문에 IEnumerator 만 실현 할 수 있다.
보통 이 기능 을 사용 하기 위해 서 는 특정한 유형의 값 을 되 돌려 주 는 함수 만 정의 해 야 합 니 다.컴 파일 러 가 전환 작업 을 사용 하기 위해 사용 하 는 두 번 째 준칙 은 함수 에서 적어도 몇 개의 특수 키워드 중 하 나 를 사용 하 는 것 이다.가장 많이 사용 되 는 것 은 yield return 문장 입 니 다.예 를 들 어 앞의 EndlessList 예 는 다음 과 같은 C \ # 교체 기 에서 이 루어 질 수 있 습 니 다.
        public static IEnumerable<int> EndlessListFunc()

        {

            int val = 0;

            while (true)

                yield return val++;

        }


이 함수 의 반환 형식 은 IEnumberable < int > 이기 때문에 이 인 터 페 이 스 를 실현 할 수 있 는 클래스 인 스 턴 스 를 사용 하 던 곳 에서 이 함 수 를 사용 할 수 있 습 니 다.다음 몇 개의 문 구 는 EndlessList Func 시퀀스 에 반복 적 으로 접근 할 수 있 습 니 다.
var list = EndlessListFunc();

foreach (var item in list)

{

     Console.WriteLine(item);

}


IEnumerator / IEnumberable 두 인터페이스 에서 사용 하 는 전체 성명 모드 는 타성 과 관련 이 있 습 니 다. 즉, 필요 할 때 만 데 이 터 를 읽 습 니 다.이런 모델 의 장점 은 하나의 서열 은 전체 알고리즘 의 매우 적 지만 매우 유연 한 부분 일 뿐 서열 도 그의 미래 사용 에 대해 어떠한 가설 도 할 필요 가 없다 는 것 이다.
다음 코드 는 교체 기의 실제 예 로 트 위 터 스 트림 의 검색 을 이용 하여 웹 서비스 에서 데 이 터 를 읽 습 니 다.웹 서비스 에서 데 이 터 를 읽 는 것 도 타성 방법 을 사용 합 니 다. 자동 페이지 기술 을 사 용 했 기 때 문 입 니 다.교체 기 는 필요 에 따라 새 페이지 를 읽 고 길이 가 알 수 없 는 문자열 순 서 를 호출 자 에 게 되 돌려 줍 니 다.호출 자 는 자신 이 좋아 하 는 방식 으로 이 서열 을 처리 합 니 다.
        private static void TwitterSearchIterator()

        {

            foreach (var tweet in GetTweets("#msdn").Take(10))

                Console.WriteLine(tweet);

        }



        private static IEnumerable<string> GetTweets(string searchString)

        {

            var url = "http://search.twitter.com/search.atom?q=";

            int page = 1;

            var escapedSearchString = searchString.Replace("@", "%40").Replace("#", "%23");

            XNamespace ns = "http://www.w3.org/2005/Atom";



            while (true)

            {

                var doc = XDocument.Load(String.Format("{0}{1} & page={2}", url, escapedSearchString, page));

                var entries = doc.Root.Elements(ns + "entry");

                if (entries.Count() == 0)

                    yield break;

                foreach (var entry in entries)

                    yield return

                        entry.Element(ns+"author").Element(ns+"name").Value+": "+WebUtility.HtmlDecode(entry.Element(ns+"title").Value;

                page++;

            }

        }


교체 기 는 앞의 예 에서 사용 한 IEnumberable 과 IEnumberable < T > 인 터 페 이 스 를 되 돌려 줄 수 있 을 뿐만 아니 라 IEnumerator 와 IEnumerator < T > 인터페이스 도 되 돌려 줄 수 있다.
C \ # 함수 식 프로 그래 밍 의 체인 교체 기
함수 형식의 교체 기 를 연결 하고 복잡 한 처리 절 차 를 만 들 기 쉽다.이 사상 은 LINQ 에 광범 위 하 게 사용 되 는데 이것 은 함수 식 프로 그래 밍 의 가장 중요 한 개념 이다.
앞에서 EndlessListFunc 교체 기 를 소 개 했 습 니 다. 무한 한 정수 시퀀스 를 되 돌려 줄 수 있 습 니 다. 처리 시퀀스 의 교체 기 함 수 는 이 교체 기와 함께 사용 할 수 있 습 니 다.예 를 들 어 다음 예 는 Take 함수 의 실현 입 니 다. 매개 변 수 를 통 해 인증서 시퀀스 와 계수 값 을 받 아들 이 고 원본 시퀀스 의 앞의 몇 가지 요소 만 되 돌려 줍 니 다.
public static IEnumerable<int> Take(int count, IEnumerable<int> source)

{

     int used = 0;

     foreach (var item in source)

         if (count > used++)

               yield return item;

         else

               yield break;

}


Take 를 EndlessListFunc 와 함께 사용 할 수 있 습 니 다:
var FiveElements = Take(5, EndlessListFunc());

foreach (var item in FiveElements)

    Console.WriteLine(item);


이 예 는 교체 기 를 모듈 로 사용 하 는 방법 을 잘 설명 한다.
체인 교체 기 에 사용 되 는 두 번 째 유형 함 수 는 실제 내용 을 사용 하 는 함수 이다. 예 를 들 어 수치 계산 을 실행 하 는 것 이다.

좋은 웹페이지 즐겨찾기