2012-03-24 47 views
1

我試圖根據下面的代碼在排序前獲取枚舉中的單個值。該值顯示兩次。爲什麼Enumerable可重複在這裏?

爲什麼?什麼是最好的解決方案?

乾杯,
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

'貨幣'是否執行'Equals'? – CodesInChaos 2012-03-24 15:34:14

+0

@CodeInChaos。它確實... – Berryl 2012-03-24 15:35:14

+2

然後,你可以拍一個'Distinct()'調用。 – CodesInChaos 2012-03-24 15:35:58

回答

1

就像@CodeInChaos說,這可能是因爲Lazy Evaluation如果GetCachedCurrencies不包含元素。

我把一個小程序放在一起,我只得到'KWD'的一個實例。

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

尼古拉對多線程調用的分析似乎在這一點上是最有可能的。請參閱編輯的文章乾杯 – Berryl 2012-03-24 16:51:59

相關問題