我被要求找出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 选择???)
有什么帮助吗?(假设这是正确的解决方案...
你的第一个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 方法(将 Where
和 First
结合起来)
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;