Dieser Code beabsichtigt, eine Spalte mit Dezimalwerten zu summieren, int.Parse()
jedoch eine Ausnahme in der int.Parse()
aus. Bitte lesen Sie am Ende dieses Beitrags, wie ich versucht habe, den Code zu korrigieren, um dies zu korrigieren und den Fehler, den ich bei diesem Versuch erhalten habe.
static void Main()
{
String htmlFile = "C:/Temp/Test11.html";
HtmlDocument doc = new HtmlDocument();
doc.Load(htmlFile);
// Site Collection Storage Used (GB)
var sum = doc.DocumentNode.SelectSingleNode("//table")
// The sum will be of the row elements
.Elements("tr")
// Skip this many rows from the top
.Skip(1)
// .ElementAt(2) = third column
// .Last() = last column
.Sum(tr => int.Parse(tr.Elements("td").ElementAt(3).InnerText));
Console.WriteLine("Site Collection Storage Used (GB): " + sum);
Console.ReadLine();
}
Hier ist die Ausnahme:
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.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.Int32.Parse(String s)
at ValueSpecifiedCellSpecifiedTable.Program.<Main>b__2(HtmlNode tr) in c:\Users\User1\Documents\Visual Studio 2012\Projects\_ValueSpecifiedCellSpecifiedTable\ValueSpecifiedCellSpecifiedTable\Program.cs:line 92
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Sum(IEnumerable`1 source)
at System.Linq.Enumerable.Sum[TSource](IEnumerable`1 source, Func`2 selector)
at ValueSpecifiedCellSpecifiedTable.Program.Main() in c:\Users\User1\Documents\Visual Studio 2012\Projects \_ValueSpecifiedCellSpecifiedTable\ValueSpecifiedCellSpecifiedTable\Program.cs:line 85
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Ich habe versucht, int.Parse () durch Decimal.Parse () zu ersetzen, aber es sagt mir:
"Error 1 Cannot implicitly convert type 'decimal' to 'int'. An explicit conversion exists (are you missing a cast?) C:\Users\hptSetupAdmin\Documents\Visual Studio 2012\Projects\_ValueSpecifiedCellSpecifiedTable\ValueSpecifiedCellSpecifiedTable \Program.cs 92 17 ValueSpecifiedCellSpecifiedTable
Nach dem Ändern von int.Parse()
in Decimal.Parse()
sehe ich nicht, wo ein int
zu konvertieren ist.
Bitte helfen Sie mir mit diesem Code, um mein Ziel zu erreichen.
Hier ist die HTML-Datei als Referenz:
<html>
<head>
<title>Tables</title>
</head>
<body>
<table border="1">
<tr>
<th>Environment</th>
<th>Databases</th>
<th>Sites</th>
<th>Site Collection Storage Used (GB)</th>
<th>Ref</th>
</th>
</tr>
<tr>
<td>Public</td>
<td>14</td>
<td>28</td>
<td>32.6602</td>
<td>2</td>
</tr>
<tr>
<td>Local</td>
<td>5</td>
<td>8</td>
<td>7.0302</td>
<td>3</td>
</tr>
<tr>
<td>Shared</td>
<td>6</td>
<td>9</td>
<td>17.092</td>
<td>9</td>
</tr>
</table>
Die Konvertierung ist fast sicher außerhalb der LINQ-Anweisung: Wenn sum ein int ist, ist eine explizite Umwandlung erforderlich. Die Deklaration der Summe als Dezimalzahl oder das Einfügen einer expliziten Umwandlung würde das Problem beheben:
// Site Collection Storage Used (GB)
sum = (int)doc.DocumentNode.SelectSingleNode("//table")
// The sum will be of the row elements
.Elements("tr")
// Skip this many rows from the top
.Skip(1)
// .ElementAt(2) = third column
// .Last() = last column
.Sum(tr => decimal.Parse(tr.Elements("td").ElementAt(3).InnerText));
Console.WriteLine("Site Collection Storage Used (GB): " + sum);
Hier ist ein Link zu einer schnellen Demo auf ideone (es ist nicht möglich, HTML agility pack auf ideone zu verwenden, also habe ich Ihre Daten in ein Array von Strings kopiert).