更短的linq查询查找货币符号?

时间:2013-01-27 08:04:44

标签: c# .net linq

我被要求查找USD(等)所具有的货币符号。 ($

另一个例子:

ILS =>

所以我写了这个:

  var isoCurrency = "ILS".ToUpper().Trim();
 foreach(CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
 {
     RegionInfo myRI1 = new RegionInfo(ci.LCID);
     if(myRI1.ISOCurrencySymbol == isoCurrency)
     {
         NumberFormatInfo nfi = ci.NumberFormat;
        console.Write( nfi);
     }
 }

但它看起来很难看。

所以我将它转换为linq:

var t= CultureInfo.GetCultures(CultureTypes.SpecificCultures)
       .Select(d=>new RegionInfo(d.LCID))
       .Where (f=>f.ISOCurrencySymbol=="ILS" )
       .Select(f=>f.CurrencySymbol).First();

但我相信我可以缩短它。 (2选择???)

任何帮助? (假设这是正确的解决方案......

3 个答案:

答案 0 :(得分:2)

您的第一个Select似乎多余。您通常应首先过滤(使用Where),然后过滤Select

编辑:Doh - 我错过了new RegionInfo()。怎么样:

var ccy = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
              .Select(c => new RegionInfo(c.LCID))
              .First(ri => ri.ISOCurrencySymbol == "ILS").CurrencySymbol;

假设您知道自己正在处理有效的ISOCurrencySymbol。如果您无法做出此假设,请先使用FirstOrDefault并在访问null之前先检查CurrencySymbol的结果。

另外需要注意的一点是,如果您经常执行此查询,则可以缓存CultureInfo.GetCultures(CultureTypes.SpecificCultures))的结果,尽管这确实是微优化。

答案 1 :(得分:1)

您可以使用接受谓词的重载First方法(合并WhereFirst

 CultureInfo.GetCultures(CultureTypes.SpecificCultures)
            .Select(c => new RegionInfo(c.LCID))
            .First(r => r.ISOCurrencySymbol == "ILS")
            .CurrencySymbol;

此代码完全符合您的代码。但实际上您应该使用FirstOrDefault并尝试获取ISO货币符号的区域。如果找到了region,则使用它:

var isoCurrency = "ILS"
var region =  CultureInfo.GetCultures(CultureTypes.SpecificCultures)
                        .Select(c => new RegionInfo(c.LCID))
                        .FirstOrDefault(r => r.ISOCurrencySymbol == isoCurrency);
if (region != null)
    // get region.CurrencySymbol

答案 2 :(得分:0)

这应该这样做:

  var t = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
                     .Select(d => new RegionInfo(d.LCID))
                     .First(f => f.ISOCurrencySymbol == "ILS").CurrencySymbol;