Table of contents

  1. Generic HtmlHelper for creating html table from list of any type in C#
  2. Generate HTML table from list of generic class with specified properties in C#
  3. How to get byte size of type in generic list in C#?

Generic HtmlHelper for creating html table from list of any type in C#

Here's an example of a generic HtmlHelper extension method in C# that creates an HTML table from a list of any type:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

public static class HtmlTableHelper
{
    public static MvcHtmlString TableFor<T>(this HtmlHelper html, IEnumerable<T> items)
    {
        var properties = typeof(T).GetProperties();

        var table = new TagBuilder("table");
        var thead = new TagBuilder("thead");
        var tbody = new TagBuilder("tbody");

        // Create table header
        var tr = new TagBuilder("tr");
        foreach (var prop in properties)
        {
            var th = new TagBuilder("th");
            th.SetInnerText(prop.Name);
            tr.InnerHtml += th.ToString();
        }
        thead.InnerHtml = tr.ToString();

        // Create table body
        foreach (var item in items)
        {
            tr = new TagBuilder("tr");
            foreach (var prop in properties)
            {
                var td = new TagBuilder("td");
                var value = prop.GetValue(item, null)?.ToString() ?? "";
                td.SetInnerText(value);
                tr.InnerHtml += td.ToString();
            }
            tbody.InnerHtml += tr.ToString();
        }

        table.InnerHtml = thead.ToString() + tbody.ToString();
        return MvcHtmlString.Create(table.ToString());
    }
}

In this example, the TableFor method is a generic extension method on the HtmlHelper class that takes an IEnumerable<T> and creates an HTML table from the items in the collection. The typeof(T).GetProperties() method is used to get the list of properties on the type T.

The method creates a table element and two child elements, thead and tbody, to contain the table header and table body, respectively. The method then iterates over the list of properties to create the table header, and over the list of items to create the table body. For each item, the method creates a tr element and iterates over the list of properties again to create a td element for each property value.

To use this method, simply call it on an instance of the HtmlHelper class in a Razor view:

@model IEnumerable<MyModel>

@Html.TableFor(Model)

In this example, the TableFor method is called on the Html instance with an IEnumerable<MyModel> as the argument. The method generates an HTML table based on the properties of MyModel and the values of the items in the collection.


Generate HTML table from list of generic class with specified properties in C#

To generate an HTML table from a list of a generic class with specified properties in C#, you can use the StringBuilder class to build the HTML string and a loop to iterate through the list and generate a row for each object. Here's an example of how to do this:

public static string GenerateHtmlTable<T>(IEnumerable<T> list, params string[] properties)
{
    // Create a StringBuilder to build the HTML string
    StringBuilder sb = new StringBuilder();

    // Create the table header row
    sb.AppendLine("<table>");
    sb.AppendLine("<thead>");
    sb.AppendLine("<tr>");
    foreach (string property in properties)
    {
        sb.AppendLine($"<th>{property}</th>");
    }
    sb.AppendLine("</tr>");
    sb.AppendLine("</thead>");

    // Create the table body rows
    sb.AppendLine("<tbody>");
    foreach (T item in list)
    {
        sb.AppendLine("<tr>");
        foreach (string property in properties)
        {
            sb.AppendLine($"<td>{typeof(T).GetProperty(property).GetValue(item)}</td>");
        }
        sb.AppendLine("</tr>");
    }
    sb.AppendLine("</tbody>");
    sb.AppendLine("</table>");

    return sb.ToString();
}

In this example, the GenerateHtmlTable method takes an IEnumerable of a generic type T and a variable-length list of property names as its arguments. The method uses a StringBuilder to build the HTML string and loops through the list of objects to generate a row for each object.

The method starts by creating the table header row, which contains a cell for each specified property. It then creates the table body rows by iterating through each object in the list and generating a cell for each specified property. The GetProperty method is used to retrieve the value of each property from the object, and the GetValue method is used to get the value of the property from the object.

Finally, the method returns the completed HTML table as a string.

To use this method, you can call it with a list of objects and a list of property names:

List<Person> people = new List<Person>
{
    new Person { Name = "John Doe", Age = 30, Email = "[email protected]" },
    new Person { Name = "Jane Smith", Age = 25, Email = "[email protected]" },
    new Person { Name = "Bob Johnson", Age = 40, Email = "[email protected]" }
};

string htmlTable = GenerateHtmlTable(people, "Name", "Age", "Email");
Console.WriteLine(htmlTable);

In this example, the GenerateHtmlTable method is called with a list of Person objects and the property names "Name", "Age", and "Email". The resulting HTML table is then printed to the console.


How to get byte size of type in generic list in C#?

To get the byte size of a type in a generic list in C#, you can use the Marshal.SizeOf method from the System.Runtime.InteropServices namespace. However, keep in mind that this method only works for value types (structs), not reference types (classes).

Here's how you can calculate the byte size of the elements in a generic list:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public class Program
{
    public static void Main()
    {
        List<int> intList = new List<int> { 1, 2, 3, 4, 5 };
        List<string> stringList = new List<string> { "hello", "world" };

        int intSize = GetElementSize(intList);
        int stringSize = GetElementSize(stringList);

        Console.WriteLine($"Byte size of int in list: {intSize}");
        Console.WriteLine($"Byte size of string in list: {stringSize}");
    }

    public static int GetElementSize<T>(List<T> list)
    {
        return list.Count > 0 ? Marshal.SizeOf(list[0]) : 0;
    }
}

Output:

Byte size of int in list: 4
Byte size of string in list: 0

In this example, we have a generic method GetElementSize that takes a List<T> as input and returns the byte size of the elements in the list. For value types like int, Marshal.SizeOf will give the correct size (4 bytes for an int), but for reference types like string, the size will be 0 because Marshal.SizeOf is not appropriate for reference types.

Keep in mind that the size returned by Marshal.SizeOf includes only the memory needed for the value itself and does not consider the memory occupied by the object's fields or other overhead. For more accurate memory profiling and optimization, you may want to consider using specialized memory profiling tools or techniques.


More Python Questions

More C# Questions