我试图让使用LINQ从一个普通的列表VAL像这样:为什么这个LINQ抛出“FormatException未处理”?
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()。该方法开始了:
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为:
System.Linq.Enumerable+WhereSelectListIterator`2[Pivotal.PriceVarianceSubsetData,System.String]
?!?
给出的错误消息是:
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)失败:
List<PriceVarianceDataAmalgamated> pvdaCraftworks = CombineSubsets(CRAFTWORKS_SC);
...并且更具体这一个(线154):
decimal price2 = Convert.ToDecimal(pvda.Price2);
显然不好的代码是这样的:
price2 = craftworksWeek2PVDSubsetList
.Where(x => x.ShortName.Equals(_shortname))
.Where(x => x.ItemCode.Equals(_itemcode))
.Select(x => x.Price).ToString();
在逐出它的位置时,“_shortname”和“_itemcode”都有一个有效值;这是完全可能是没有价值的选择,但我似乎被赋予一个默认值price2进行防御是:
string price2 = "0.00";
price2是在方法的最后返回 - 也许我应该使用catch块并在那里分配fallback值,而不是从git-go?
尝试'.Select(x => x.Price).First()。ToString();' – AlexD
您的更具体的行与早前的 –
完全相同我同意与之前一样,但使用不会抛出异常的FirstOrDefault,而是返回空值作为引用类型和值类型的默认值。可以让你更容易找到问题所在。 –