2012-10-30 46 views
5

Tôi có một danh sách:Chuyển đổi Danh sách vào một danh sách Pivot

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

này trả về một danh sách như thế này:

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 

này tiếp tục trên và vào nơi đôi khi tôi sẽ có 50-100 HeaderTitles khác nhau

Tôi cần có khả năng xoay vòng điều này và cuối cùng ghi nó vào CSV với Hàng là tiêu đề. Tôi biết làm thế nào để chuyển đổi một đối tượng sang CSV nhưng tôi đang có một thời gian siêu khó khăn xoay quanh danh sách và hy vọng ai đó có thể giúp đỡ.

đây là những gì tôi muốn nó trông giống như:

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 

Ai đó có thể giúp tôi làm công việc này? Tôi thực sự chỉ cần có khả năng xoay Danh sách của tôi thành một Danh sách mới mà cuối cùng sẽ là một tệp CSV ... Tôi biết cách thực hiện nó trong SQL nhưng tôi không thể sử dụng SQL trong trường hợp này.

+0

Các bạn đã nhìn sử dụng [String.split Phương pháp] (http://msdn.microsoft.com/en-us/library/ b873y76a.aspx) để tách các giá trị của bạn? –

+0

Có nhưng không thể làm cho nó hoạt động –

+0

Hãy thử cách này: http://www.extensionmethod.net/csharp/ienumerable-t/pivot – hehewaffles

Trả lời

1

Đây là những gì tôi đã kết thúc làm những gì làm việc cho tôi:

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


} 
Các vấn đề liên quan