首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个LINQ抛出"FormatException was unhandled"?

为什么这个LINQ抛出"FormatException was unhandled"?
EN

Stack Overflow用户
提问于 2016-07-06 06:44:58
回答 0查看 318关注 0票数 2

我正在尝试使用LINQ从泛型列表中获取val,如下所示:

代码语言:javascript
复制
private List<PriceVarianceDataAmalgamated> CombineSubsets(string unit)
{
    List<PriceVarianceDataAmalgamated> combinedSubsets = new List<PriceVarianceDataAmalgamated>();
    if (unit.Equals(CRAFTWORKS_SC))
    {
        foreach (PriceVarianceSubsetData pvsd in craftworksWeek1PVDSubsetList)
        {
            PriceVarianceDataAmalgamated pvda = new PriceVarianceDataAmalgamated
            {
                ShortName = pvsd.ShortName,
                ItemCode = pvsd.ItemCode,
                Description = pvsd.Description,
                Price1 = pvsd.Price,
                Price2 = GetPrice2(CRAFTWORKS_SC, pvsd.ShortName, pvsd.ItemCode)
            };
            pvda.Variance = "0.00";
            decimal price1 = Convert.ToDecimal(pvda.Price1);
            decimal price2 = Convert.ToDecimal(pvda.Price2);
            . . .

关键部分(无法完成我希望它做的事情)是对GetPrice2()的调用。该方法开始于:

代码语言:javascript
复制
private string GetPrice2(string _unit, string _shortname, string _itemcode)
{
    string price2 = "0.00";
    if (_unit.Equals(CRAFTWORKS_SC))
    {
        price2 = craftworksWeek2PVDSubsetList
            .Where(x => x.ShortName.Equals(_shortname))
            .Where(x => x.ItemCode.Equals(_itemcode))
            .Select(x => x.Price).ToString();
    }
    . . .

当我进入对price2的赋值时,被赋值的val是:

代码语言:javascript
复制
System.Linq.Enumerable+WhereSelectListIterator`2[Pivotal.PriceVarianceSubsetData,System.String]

?!?

给定的err msg为:

代码语言:javascript
复制
System.FormatException was unhandled
  HResult=-2146233033
  Message=Input string was not in a correct format.
  Source=mscorlib
  StackTrace:
       at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
       at System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt)
       at System.Convert.ToDecimal(String value)
       at Pivotal.FormMain.CombineSubsets(String unit) in c:\Projects\PriceVariance\Pivotal\Form1.cs:line 290
       at Pivotal.FormMain.GenerateAndSaveSpreadsheetFile() in c:\Projects\PriceVariance\Pivotal\Form1.cs:line 154
       at Pivotal.FormMain.buttonRun_Click(Object sender, EventArgs e) in c:\Projects\PriceVariance\Pivotal\Form1.cs:line 137
. . .

所以这一行(290)失败了:

代码语言:javascript
复制
List<PriceVarianceDataAmalgamated> pvdaCraftworks = CombineSubsets(CRAFTWORKS_SC);

...and更具体地说是下面这一行(第154行):

代码语言:javascript
复制
decimal price2 = Convert.ToDecimal(pvda.Price2);

显然,糟糕的代码是:

代码语言:javascript
复制
price2 = craftworksWeek2PVDSubsetList
    .Where(x => x.ShortName.Equals(_shortname))
    .Where(x => x.ItemCode.Equals(_itemcode))
    .Select(x => x.Price).ToString();

在遍历它发生爆炸的地方时,"_shortname“和"_itemcode”都有一个有效的值;完全有可能没有值可供选择,但我似乎是通过为price2分配一个默认值来防御这种情况:

代码语言:javascript
复制
string price2 = "0.00";

price2是在方法的末尾返回的--也许我应该使用catch块并将回退值赋值给它,而不是从git-go?

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38214007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档