我被要求查找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选择???)
任何帮助? (假设这是正确的解决方案...... )
答案 0 :(得分:2)
您的第一个Select
似乎多余。您通常应首先过滤(使用Where
),然后过滤Select
。
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方法(合并Where
和First
)
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;