Создание HTML-таблицы из списка вызывает исключение null (печать на консоль работает)

#c#

#c#

Вопрос:

Вот метод создания HTML-таблицы:

    public static string CreateHTMLTable<T>(IEnumerable<T> list, params Func<T, (object, string)>[] fxns) // Used for generating HTML tables for Outlook
    {
        var sb = new StringBuilder();
        sb.Append("<table>n");
        sb.Append("<thead>n");
        sb.Append("<tr>n");

        foreach (var fxn in fxns)
            sb.Append("<th>").Append(fxn(default).Item2).AppendLine("</th>");

        sb.Append("</tr>n");
        sb.Append("</thead>n");

        foreach (var item in list)
        {
            sb.Append("<tr>n");
            foreach (var fxn in fxns)
            {
                sb.Append("<td>");
                sb.Append(fxn(item).Item1);
                sb.Append("</td>");
            }
            sb.Append("n</tr>n");
        }
        sb.Append("</table>");

        return sb.ToString();
    } 
  

У меня есть Linq:

         var ComparedProjectsList = MainProcess.Projects.AsEnumerable()
            .GroupBy(x => x.Field<string>("PROJECTNUMBER").Trim())
            .Select(x => new
            {
                PROJECTNUMBER = x.Key,
                PROJECTNAME = x.Select(y => y.Field<string>("PROJECTNAME").Trim()),
                user = x.Select(y => y.Field<string>("PROJECTMANAGER").Trim()).Distinct().ToList()
            })
            .Where(x => x.user.Count > 1)
            .Select(x => new
            {
                PROJECTNUMBER = x.PROJECTNUMBER,
                PROJECTNAME = x.PROJECTNAME.First().ToString(),
                ProjectManager = x.user[0],
                ProjectManager2 = x.user[1]
            })
            .ToList();
  

Просто для проверки наличия фактических значений:

         foreach (var item in ComparedProjectsList)
        {
            Console.WriteLine("{0} - {1} {2} / {3}", item.PROJECTNUMBER, item.PROJECTNAME, item.ProjectManager, item.ProjectManager2);
        }
  

Я сажусь за консоль:

 123456 - PROJECT 1 JOHN SMITH / DONALD RED
235454 - PROJECT 2 LIINOS TORVALDS / FUJI BANKS
456546 - PROJECT 3 STEVEN SEAGAL / TOM HAWK
  

Я использую это для создания HTML-таблицы:

         var ComparedHTMLTableProject = CreateHTMLTable,
            x => (x.PROJECTNUMBER, "Project number"),
            x => (x.PROJECTNAME, "Sub-project number"),
            x => (x.ProjectManager, "Project manager"),
            x => (x.ProjectManager2, "Project manager 2")
            ); 
  

Я получаю исключение:

System.NullReferenceException HResult=0x80004003 Message=Ссылка на объект не установлена для экземпляра объекта.
Источник=Трассировка стека DeliveryProjectAnalyzer: в DeliveryProjectAnalyzer.Program.<>c.b__9_7(<>f__AnonymousType5`4 x) в x было null.

Почему так? Как x равно null, если оно напечатано на консоли? Я также не понимаю, в какой момент я должен проверять значение null, поскольку печать на консоль работает без каких-либо проблем? В дополнение к этому я использовал CreateHTMLTable метод и раньше в аналогичных случаях для изменения списка в таблицу HTML без каких-либо проблем.

Комментарии:

1. В вашем последнем блоке кода, где вы назначаете ComparedHTMLTableProject, нет соответствующих круглых скобок. Я не говорю, что это проблема, но она не совпадает.

Ответ №1:

Для всех, кто может задаваться тем же вопросом, вот решение:

     var ComparedHTMLTableProject = CreateHTMLTable,
        x => (x?.PROJECTNUMBER, "Project number"),
        x => (x?.PROJECTNAME, "Sub-project number"),
        x => (x?.ProjectManager, "Project manager"),
        x => (x?.ProjectManager2, "Project manager 2")
        );