#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")
);