用于查找货币符号的较短 linq 查询

本文关键字:linq 查询 查找 货币 符号 用于 | 更新日期: 2023-09-27 17:56:24

我被要求找出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 选择???)

有什么帮助吗?(假设这是正确的解决方案...

用于查找货币符号的较短 linq 查询

你的第一个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并在访问CurrencySymbol之前先检查null的结果。

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

您可以使用接受谓词的重载 First 方法(将 WhereFirst 结合起来)

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

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

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

这应该可以做到:

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