나는과 같이 일반적인 목록에서 LINQ를 사용하여 발을 얻기 위해 노력하고 있어요 :이 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);
. . .
핵심 부분 (즉 I가 원하는 것을 할 실패)() 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 때, 할당 된 발입니다 :
System.Linq.Enumerable+WhereSelectListIterator`2[Pivotal.PriceVarianceSubsetData,System.String]
?!?
주어진 ERR의 MSG
입니다 는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 블록을 사용하고 git-go가 아닌 fallback 값을 할당 하시겠습니까?
.Select (x => x.Price) .First(). ToString(); ' – AlexD
더 구체적인 줄은 이전의 –
과 동일합니다. 먼저, 예외를 throw하지 않는 FirstOrDefault를 사용하여 참조 유형과 값 유형의 기본값을 null 값으로 반환합니다. 문제가있는 곳을 쉽게 찾을 수 있습니다. –