2014-03-05 2 views
1

저는 현재 C# 과정을 배우고 있으며 설명이 필요합니다. 아마도 경험이 많은 사람에게는 논리적이고 간단 할 것입니다.하지만 코드는 이런 방식으로 작동해야한다고 생각합니다. 누락 된 코드 출력에 대한 설명이 필요합니다.

나는 의 foreach라는 이름의 반복자를 사용하여 루프 내 Garage 클래스 carArray 내부의 모든 Car 객체를 인쇄하기 위해 노력하고있어,하지만 난 거짓GetTheCars에 대한 방법을 전달하고 다른 블록 내부에 들어갈 때 아무 일도 발생하지 않습니다. 역순으로 인쇄 배열을 잘 작동합니다. 이 .. 코드입니다

Main 메서드

:

static void Main(string[] args) 
    { 
     Garage carLot = new Garage(); 

     foreach (Car c in carLot.GetTheCars(false)) 
     { 
      Console.WriteLine("{0} is going {1} MPH", c.PetName, c.CurrentSpeed); 
     } 

     Console.WriteLine(); 

     foreach (Car c in carLot.GetTheCars(true)) 
     { 
      Console.WriteLine("{0} is going {1} MPH", c.PetName, c.CurrentSpeed); 
     } 
    } 

주차장 클래스 : else 문 안에있는 책의 예에서

class Garage : IEnumerable 
{ 
    private Car[] carArray = new Car[4]; 

    public Garage() 
    { 
     carArray[0] = new Car("Rusty", 30); 
     carArray[1] = new Car("Clunker", 55); 
     carArray[2] = new Car("Zippy", 30); 
     carArray[3] = new Car("Fred", 30); 
    } 

    public IEnumerator GetEnumerator() 
    { 
     foreach (Car c in carArray) 
     { 
      yield return c; 
     } 
    } 

    public IEnumerable GetTheCars(bool ReturnReversed) 
    { 
     if (ReturnReversed) 
     { 
      for (int i = carArray.Length; i != 0; i--) 
      { 
       yield return carArray[i-1]; 
      } 
     } 
     else 
     { 
      GetEnumerator(); 
     } 
    } 

이 같은 코드를 같이 작성 GetEnumerator() 방법 :

도서 코드 differe 후부는 :

else 
{ 
    foreach (Car c in carArray) 
    { 
     yield return c; 
    } 
} 

나는이 책의 앞의 예에서 사용 된 GetEnumerator() 방법 내부의 코드를 재사용 할 수 있다고 생각하지만, 그것은 아무것도를 출력하지 않습니다. 누군가 제가 왜 감사히 여기고 환호하고 감사 드려야하는지 설명 해줄 수 있다면!

답변

6

else 블록에서 GetEnumerator (으)로 전화하고 있지만 자동으로 아무것도 생성하지는 않습니다.

// This doesn't actually work! 
yield all carArray; 

...하지만 C#에는 그런 구조가 없습니다. 당신은 사용할 수 있습니다

else 
{ 
    using (var iterator in GetEnumerator()) 
    { 
     while (iterator.MoveNext()) 
     { 
      yield return iterator.Current; 
     } 
    } 
} 

또는 GetEnumerator를 건너 :

else 
{ 
    foreach (var var in carArray) 
    { 
     yield return car; 
    } 
} 

을 ...하지만 분명히 그것은 꽤 추한.

당신 사용자 정의 주문해야 할 경우에만 반복자 블록 (yield return 제표와 방법의 종류)을 사용하도록 코드를 밖으로 분리되어 수행

// Made return type generic, and improved the name 
public IEnumerable<Car> GetTheCars(bool reverseOrder) 
{ 
    return reverseOrder ? GetTheCarsReversed() : carArray; 
} 

private IEnumerable<Car> GetTheCarsReversed() 
{ 
    for (int i = carArray.Length; i != 0; i--) 
    { 
     yield return carArray[i - 1]; 
    } 
} 

단점을 가지고 않습니다 순서를 바꾸라고 요청하지 않으면 배열 참조를 직접 반환하는 것과 관련하여 호출자는 Car[]으로 캐스팅하고 배열을 수정할 수 있습니다. 그러나 그것은 아마도 아직 알 필요가없는 뉘앙스 일 것입니다.

3

이 코드는 아마도 여러분의 실험 일 뿐이지 만, IEnumerable을 역순으로 얻으려면 Linq 확장 방법 Reverse을 사용할 수 있습니다.

귀하의 GetTheCars() 방법은 다음 바로 쓸 수
using System.Linq; 

... 

foreach (var c in carLot.GetTheCars().Reverse()) 
{ 
    Console.WriteLine("{0} is going {1} "MPH", c.PetName, c.CurrentSpeed); 
} 

:

public IEnumerable<Car> GetTheCars() 
{ 
    return carArray; 
} 
관련 문제