2012-10-30 9 views
5

Mam listę:Convert List do listy Pivot

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

ta zwraca listę takiego:

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 

ten trwa dalej i dalej, gdzie czasami będę musiał 50-100 różne HeaderTitles

Muszę być w stanie to obrócić i ostatecznie napisać do pliku CSV z wierszem będącym nagłówkiem. Wiem, jak przekonwertować obiekt do pliku CSV, ale mam super trudny czas na przestawienie listy i mam nadzieję, że ktoś może pomóc.

tutaj jest to, co chcę to wyglądać:

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 

Czy ktoś może mi pomóc w tej pracy? Naprawdę muszę mieć możliwość przestawienia mojej listy do nowej listy, która ostatecznie będzie plikiem CSV ... Wiem, jak to zrobić w SQL, ale nie mogę używać SQL w tym scenariuszu.

+0

masz spojrzał na użyciu [String.split Metoda] (http://msdn.microsoft.com/en-us/library/ b873y76a.aspx), aby oddzielić swoje wartości? –

+0

Tak, ale nie mogłem go uruchomić –

+0

Spróbuj tego: http://www.extensionmethod.net/csharp/ienumerable-t/pivot – hehewaffles

Odpowiedz

1

Oto, co skończyło się tym, co pracował dla mnie:

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; 
    } 
} 


}