문제

다음 코드가 있다고 가정합니다.

foreach(string str in someObj.GetMyStrings())
{
    // do some stuff
}

할 것이다 someObj.GetMyStrings() 루프의 모든 반복에 호출 되나요? 대신 다음을 수행하는 것이 좋습니다.

List<string> myStrings = someObj.GetMyStrings();
foreach(string str in myStrings)
{
    // do some stuff
}

?

도움이 되었습니까?

해결책

이 기능은 한 번만 호출되어 IEnumerator<T>; 그 후, MoveNext() 방법과 Current 속성은 결과를 통해 반복하는 데 사용됩니다.

foreach (Foo f in GetFoos())
{
    // Do stuff
}

다소 동일합니다.

using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator())
{
    while (iterator.MoveNext())
    {
        Foo f = iterator.Current;
        // Do stuff
    }
}

반복자는 마지막에 배치됩니다. 이는 반복자 블록에서 리소스를 처리하는 데 특히 중요합니다.

public IEnumerable<string> GetLines(string file)
{
    using (TextReader reader = File.OpenText(file))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

위 코드에서 반복을 완료 할 때 파일이 닫히고 컴파일러가 구현되기를 원합니다. IDisposable 그 일을하기 위해 교활하게.

다른 팁

아니요 ..이 기능은 ienumerable을 얻기 위해 한 번 호출됩니다. 그리고 Movenext 및 Current에 반복적으로 호출됩니다.

getMyStrings ()는 ienumerable 유형의 객체를 재조정합니다. 런타임은이를 다루는 방법을 알고 있습니다. ienumerable.getenumerator ()를 호출 한 다음 해당 열거 자체에서 객체를 호출하고 current를 호출합니다.

당신이 "모두가 동일하다"고 속인 경우에 대한 질문을 반올림하기 위해; for (int x = 0; x <provideceiling (); x ++)하다 매번 함수를 호출하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top