2012-03-24 5 views
1

아래 코드에 따라 열거 형 내에 하나의 값을 가져 오려고합니다. 값이 두 번 나타납니다.열거 형 연결을 여기에서 반복하는 이유는 무엇입니까?

왜? 가장 좋은 것은 무엇입니까?

건배
Berryl

private static IEnumerable<Currency> _commonCurrencies; 

    public static IEnumerable<Currency> GetCommonCurrencies() { 
     return _commonCurrencies ?? 
       (_commonCurrencies 
       = Currency.GetCachedCurrencies() 
         .Concat(new[] {Currency.Get(CurrencyIsoCode.KWD)}) 
         .Where(x => !x.AlphabeticCode.StartsWith("X", StringComparison.InvariantCultureIgnoreCase)) 
         .OrderBy(x => x.AlphabeticCode)); 
    } 

출력

... 
JPY 
KWD 
KWD // repeats? 
... 

EDIT

Currency.GetCurrencies()는 사전 감싸는 스레드 세이프 캐시의 일 구현에 대한 호출을 만드는 값을 반환합니다.

public ICollection<TValue> Values { get { return _inner.Values; } } 

이 유형의 소유자가 아닙니다. 코드를 'slap'으로 변경 ToArray()는 문제를 수정하여 concat 값이 한 번만 나타나고 받아 들일 수있는 솔루션입니다. 왜 스레드가 루트에있는 것처럼 보이지만 열거 형을 강제하지 않고 두 번 나타나는지 잘 모르겠다.

+0

'통화'는 '같음'을 구현합니까? – CodesInChaos

+0

@CodeInChaos. 그것은 수행합니다 ... – Berryl

+2

그러면 'Distinct()'호출을 할 수 있습니다. – CodesInChaos

답변

1

@CodeInChaos와 마찬가지로 GetCachedCurrencies에 요소가 포함되어 있지 않은 것은 아마도 Lazy Evaluation 때문일 수 있습니다.

나는 작은 프로그램을 조립하고 나는 단지 'KWD'의 1 인스턴스만을 얻는다.

enum CurrencyIsoCode 
{ 
    USD, 
    KWD, 
    JPY, 
    XCD, 
    TVD 
} 

class Currency 
{ 
    public Currency() : this(false) { } 
    public Currency(bool inner) { } 

    public static IEnumerable<Currency> GetCachedCurrencies() 
    { 
     return new[] { 
      new Currency() { currencyCode = CurrencyIsoCode.USD }, 
      new Currency() { currencyCode = CurrencyIsoCode.JPY }, 
      new Currency() { currencyCode = CurrencyIsoCode.XCD } 
      }; 
    } 

    public CurrencyIsoCode currencyCode { set; get; } 

    public string AlphabeticCode 
    { 
     get { return currencyCode.ToString(); } 
    } 

    public static Currency Get(CurrencyIsoCode isOCode) 
    { 
     return new Currency() { currencyCode = isOCode }; 
    } 
} 

class Program 
{ 
    private static IEnumerable<Currency> _commonCurrencies = null; 

    static void Main(string[] args) 
    { 
     var currencies = GetCommonCurrencies(); 

     foreach (var curr in currencies) 
      Console.WriteLine(curr.AlphabeticCode); 

     Console.Read(); 
    } 


    public static IEnumerable<Currency> GetCommonCurrencies() 
    { 
     return _commonCurrencies ?? 
      (_commonCurrencies 
      = Currency.GetCachedCurrencies() 
        .Concat(new[] {Currency.Get(CurrencyIsoCode.KWD)}) 
        .Where(x => !x.AlphabeticCode.StartsWith("X", StringComparison.InvariantCultureIgnoreCase)) 
        .OrderBy(x => x.AlphabeticCode)); 
    }  
} 
+0

Nikola의 다중 스레드 호출에 대한 분석이이 시점에서 가능한 것 같습니다. 편집 된 게시물보기 건배 – Berryl