{"id":7440,"date":"2023-02-23T16:06:10","date_gmt":"2023-02-23T15:06:10","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=7440"},"modified":"2025-09-19T13:04:27","modified_gmt":"2025-09-19T12:04:27","slug":"c-listview-builder","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/c-listview-builder\/","title":{"rendered":"C# ListView\/FlatList Builder"},"content":{"rendered":"\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">public class FlatList\n{\n    public FlatList(IEnumerable&lt;string> columns, List&lt;List&lt;object>> data, int totalCount)\n    {\n        Columns = columns;\n        Data = data;\n        TotalCount = totalCount;\n    }\n\n    public IEnumerable&lt;string> Columns { get; }\n    public List&lt;List&lt;object>> Data { get; }\n    public int TotalCount { get; }\n}\n\npublic class ColumnMetaData&lt;T>\n{\n    public string Name { get; set; }\n    public Func&lt;T, object> ValueSelector { get; set; }\n}\n\npublic class FlatListBuilder&lt;T>\n{\n    private readonly List&lt;ColumnMetaData&lt;T>> Columns = new();\n\n    public FlatListBuilder&lt;T> AddColumn(string propertyName, Func&lt;T, object> valueGetter)\n    {\n        var x = new ColumnMetaData&lt;T>();\n        x.Name = propertyName;\n        x.ValueSelector = (y) =>\n        {\n            return valueGetter(y);\n        };\n        Columns.Add(x);\n        return this;\n    }\n\n    public FlatList Build(IEnumerable&lt;T> items, int? totalCount = null)\n    {\n        var data = items.Select(x => Columns.Select(y => y.ValueSelector(x)).ToList()).ToList();\n        return new FlatList(Columns.Select(x => x.Name), data, totalCount ?? items.Count());\n    }\n}\n\n\/\/ usage:\nvar flatListBuilder = new FlatListBuilder&lt;VmLookupItem>()\n    .AddColumn(\"id\", x => x.Id)\n    .AddColumn(\"name\", x => x.Description)\n    .AddColumn(\"additionalInfo\", x => x.AdditionalInfo);\nreturn flatListBuilder.Build(cachedItems);<\/pre><\/div>\n\n\n\n<p>Convert data back in typescript:<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"typescript\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">export interface IListView {\n    columns: string[];\n    data: Array&lt;any[]>;\n}\n\nexport function mapListView&lt;T>(listView: IListView): T[] {\n    const columns = listView.columns.map((name, i) => ({ index: i, name: name }));\n    return listView.data.map((row) => {\n        const item: any = {};\n        for (const { index, name } of columns)\n            item[name] = row[index];\n        return item as T;\n    });\n}\n\nasync getAllDebtorArticles(debtorId: string): Promise&lt;IDebtorArticle[]> {\n    const listView = await appDependencies.IRestApi.request(`api\/article\/debtor\/${debtorId}`).getData&lt;IListView>();\n    return mapListView&lt;IDebtorArticle>(listView);\n}\n\n<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Convert data back in typescript:<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-7440","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/7440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=7440"}],"version-history":[{"count":6,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/7440\/revisions"}],"predecessor-version":[{"id":9779,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/7440\/revisions\/9779"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=7440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=7440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=7440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}