2012-10-30 54 views
5

我有一个列表:转换列表到枢轴表

IList<PIData> list = new List<PIData>() 

这将返回像这样的列表:

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并将行作为标题。我知道如何将对象转换为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转移到一个新的List,最终将成为一个CSV文件...我知道如何在SQL中完成,但在这种情况下我不能使用SQL。

+0

有你看着使用[String.Split方法](http://msdn.microsoft.com/en-us/library/ b873y76a.aspx)来分隔你的值? –

+0

是的,但不能得到它的工作 –

+0

试试这个:http://www.extensionmethod.net/csharp/ienumerable-t/pivot – hehewaffles

回答

1

这里是我落得这样做对我工作:

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<PiData>() 
     { 
      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<string> columns = new List<string>(); 
    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<TFirstKey, Dictionary<TSecondKey, TValue>> Pivot<TSource, TFirstKey, TSecondKey, TValue>(this IEnumerable<TSource> source, Func<TSource, TFirstKey> firstKeySelector, Func<TSource, TSecondKey> secondKeySelector, Func<IEnumerable<TSource>, TValue> aggregate) 
    { 
     var retVal = new Dictionary<TFirstKey, Dictionary<TSecondKey, TValue>>(); 

     var l = source.ToLookup(firstKeySelector); 
     foreach (var item in l) 
     { 
      var dict = new Dictionary<TSecondKey, TValue>(); 
      retVal.Add(item.Key, dict); 
      var subdict = item.ToLookup(secondKeySelector); 
      foreach (var subitem in subdict) 
      { 
       dict.Add(subitem.Key, aggregate(subitem)); 
      } 
     } 

     return retVal; 
    } 
} 


}