Skip to content

Instantly share code, notes, and snippets.

@danielmackay
Last active December 27, 2015 01:09
Show Gist options
  • Save danielmackay/7242909 to your computer and use it in GitHub Desktop.
Save danielmackay/7242909 to your computer and use it in GitHub Desktop.
CSV builder. #csv
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Utilities
{
public class CsvBuilder
{
private readonly string delimiter;
public CsvBuilder(string delimiter)
{
this.delimiter = delimiter;
}
public string GetCsv<T>(IEnumerable<T> items) where T : class
{
var type = items.GetType().GetGenericArguments()[0];
var header = GetHeader(type);
var sb = new StringBuilder();
sb.AppendLine(header);
foreach (var content in items)
{
sb.AppendLine(GetContent(content));
}
return sb.ToString();
}
private string GetHeader(Type type)
{
var sb = new StringBuilder();
var props = type.GetProperties().OrderBy(p => p.Name);
foreach (var property in props)
{
sb.AppendFormat("{0}{1}", property.Name, delimiter);
}
return sb.ToString(0, sb.Length - 1);
}
private string GetContent<T>(T item) where T : class
{
if (item is ICsv)
{
var csvItem = item as ICsv;
return csvItem.ToCsv(delimiter);
}
var sb = new StringBuilder();
var type = item.GetType();
var props = type.GetProperties().OrderBy(p => p.Name);
foreach (var property in props)
{
sb.AppendFormat("{0}{1}", property.GetValue(item), delimiter);
}
return sb.ToString(0, sb.Length - 1);
}
public interface ICsv
{
string ToCsv(string delimiter);
}
}
public static class EnumerableExt
{
public static string ToCsv<T>(this IEnumerable<T> items, string delimiter) where T : class
{
var cb = new CsvBuilder(delimiter);
return cb.GetCsv(items);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment