将列表转换为数据透视列表

我有一个清单:

IList list = new List() 

这将返回如下列表:

 Timestamp | End | HeaderTitle | Value ========================================================= 12/12/2012 00:00 | 12/12/2012 00:01 | Test1 | 0.23 12/12/2012 00:00 | 12/12/2012 00:01 | Test2 | 0.34 12/12/2012 00:00 | 12/12/2012 00:01 | Test3 | 0.556 

这种情况一直持续到有时我会有50-100个不同的HeaderTitles

我需要能够转动它并最终将其写入CSV,其中Row是标题。 我知道如何将一个对象转换为CSV,但我有一个非常困难的时间转动列表并希望有人可以提供帮助。

这是我想要的样子:

 Timestamp | End | Test1 | Test2 | Test3 | etc ================================================================== 12/12/2012 00:00 | 12/12/2012 00:01 | 0.23 | 0.34 | 0.556 12/12/2012 00:01 | 12/12/2012 00:02 | 0.23 | 0.34 | 0.556 12/12/2012 00:02 | 12/12/2012 00:03 | 0.23 | 0.34 | 0.556 

有人可以帮助我做这项工作吗? 我真的只需要能够将我的List转移到一个最终将成为CSV文件的新列表……我知道如何在SQL中执行此操作,但我不能在这种情况下使用SQL。

以下是我最终做的对我有用的事情:

 namespace ConsoleApplication3 { class Program { internal class PiData { public string HeaderName { get; set; } public DateTime TimeStamp { get; set; } public DateTime End { get; set; } public double Value { get; set; } } static void Main(string[] args) { var PD = new List() { new PiData() { HeaderName="Test1", End = DateTime.Now.AddSeconds(15), TimeStamp = DateTime.Now, Value = 0.01 }, new PiData() { HeaderName="Testf2", End = DateTime.Now.AddSeconds(15), TimeStamp = DateTime.Now, Value = 0.51 }, new PiData() { HeaderName="Testff3", End = DateTime.Now.AddSeconds(15), TimeStamp = DateTime.Now, Value = 0.71 }, new PiData() { HeaderName="Testfsd4", End = DateTime.Now.AddSeconds(15), TimeStamp = DateTime.Now, Value = 0.41 }, new PiData() { HeaderName="Test1", End = DateTime.Now.AddSeconds(30), TimeStamp = DateTime.Now.AddSeconds(15), Value = 0.01 }, new PiData() { HeaderName="Testf2", End = DateTime.Now.AddSeconds(30), TimeStamp = DateTime.Now.AddSeconds(15), Value = 0.51 }, new PiData() { HeaderName="Testff3", End = DateTime.Now.AddSeconds(30), TimeStamp = DateTime.Now.AddSeconds(15), Value = 0.71 }, new PiData() { HeaderName="Testfsd4", End = DateTime.Now.AddSeconds(30), TimeStamp = DateTime.Now.AddSeconds(15), Value = 0.41 }, }; var result2 = PD.Pivot(emp => emp.TimeStamp, emp2 => emp2.HeaderName, lst => lst.Sum(a => a.Value)); StringBuilder sb = new StringBuilder(); List columns = new List(); columns.Add("TimeStamp"); columns.Add("End"); foreach (var item in PD.Select(a => a.HeaderName).Distinct()) { columns.Add(item); } foreach (var item in columns) { sb.Append(item + ","); } sb.Remove(sb.Length - 1, 1); sb.AppendLine(); foreach (var row in result2) { sb.Append(row.Key + "," + row.Key.AddSeconds(10).ToString() + ","); foreach (var column in row.Value) { sb.Append(column.Value + ","); } sb.Remove(sb.Length - 1, 1); sb.AppendLine(); } Console.WriteLine(sb.ToString()); Console.WriteLine("----"); } } public static class LinqExtenions { public static Dictionary> Pivot(this IEnumerable source, Func firstKeySelector, Func secondKeySelector, Func, TValue> aggregate) { var retVal = new Dictionary>(); var l = source.ToLookup(firstKeySelector); foreach (var item in l) { var dict = new Dictionary(); retVal.Add(item.Key, dict); var subdict = item.ToLookup(secondKeySelector); foreach (var subitem in subdict) { dict.Add(subitem.Key, aggregate(subitem)); } } return retVal; } } }