Как суммировать десятичное значение из столбца таблицы в файле html для C #

c# html-agility-pack html-parsing linq

Вопрос

Этот код намеревается суммировать столбец десятичных значений, но генерирует исключение в int.Parse() . Пожалуйста, см. В конце этого сообщения, как я попытался пересмотреть код, чтобы исправить это, и ошибку, которую я получил с этой попыткой.

    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();
    }

Вот исключение:

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: 

Я попытался заменить int.Parse () на Decimal.Parse (), но он говорит мне:

"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

После изменения int.Parse() в Decimal.Parse() Я не вижу, где есть int для преобразования.

Пожалуйста, помогите мне с этим кодом для достижения моей цели.

Вот файл html для справки:

<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>

Принятый ответ

Преобразование почти наверняка за пределами оператора LINQ: если sum - это int, то здесь требуется явное приведение. Объявление суммы в виде десятичной дроби или вставки явного броска должно устранить проблему:

    // 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);

Вот ссылка на быстрое демо на идеоне (невозможно использовать пакет гибкости HTML на ideone, поэтому я скопировал ваши данные в массив строк).



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему