C \ # 함수 식 프로 그래 밍 의 타성 목록 도구 - 교체 기
6145 단어 프로 그래 밍
타성 매 거 는 교체 방법 으로 그 핵심 사상 은 필요 할 때 만 데 이 터 를 읽 는 것 이다.이 사상 은 모든 교체 알고리즘 이 매우 효과 적 이 고 수요 에 따라 임의의 데 이 터 를 유연 하 게 읽 을 수 있 으 며 과도 한 비용 을 초래 하지 않 을 것 을 보장 한다.
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);
이 예 는 교체 기 를 모듈 로 사용 하 는 방법 을 잘 설명 한다.
체인 교체 기 에 사용 되 는 두 번 째 유형 함 수 는 실제 내용 을 사용 하 는 함수 이다. 예 를 들 어 수치 계산 을 실행 하 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux Shell 프로 그래 밍 - 텍스트 처리 grep, sed사용자 가 지정 한 '모드' 에 따라 대상 텍스트 를 일치 하 게 검사 하고 일치 하 는 줄 을 인쇄 합 니 다. ##포함 되 지 않 음, 역방향 일치 \ ##키워드 앞 뒤 가 맞지 않 고 키워드 만 일치 합 니 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.