C# 将列表转换为透视列表

C# 将列表转换为透视列表,c#,.net,pivot,C#,.net,Pivot,我有一份清单: IList<PIData> list = new List<PIData>() 这种情况持续不断,有时我会有50-100个不同的头颅 我需要能够将其旋转,并最终将其写入一个以行为标题的CSV。我知道如何将一个对象转换为CSV,但我很难旋转列表,希望有人能帮助我 以下是我希望它看起来像什么: Timestamp | End | Test1 | Test2 | Test3 | etc =================

我有一份清单:

IList<PIData> list = new List<PIData>()
这种情况持续不断,有时我会有50-100个不同的头颅

我需要能够将其旋转,并最终将其写入一个以行为标题的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

有人能帮我做这件事吗?我真的只需要能够将我的列表旋转到一个最终将成为CSV文件的新列表。。。我知道如何在SQL中使用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<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;
    }
}


}
命名空间控制台应用程序3
{
班级计划
{
内部类PiData
{
公共字符串头名称{get;set;}
公共日期时间时间戳{get;set;}
公共日期时间结束{get;set;}
公共双值{get;set;}
}
静态void Main(字符串[]参数)
{
var PD=新列表()
{
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=新的StringBuilder();
列表列=新列表();
列。添加(“时间戳”);
列。添加(“结束”);
foreach(PD.Select(a=>a.HeaderName.Distinct()中的变量项)
{
列。添加(项);
}
foreach(列中的变量项)
{
sb.追加(项目+“,”);
}
移除(sb长度-1,1);
(某人);
foreach(结果2中的变量行)
{
sb.Append(row.Key+”,“+row.Key.AddSeconds(10.ToString()+”,”);
foreach(row.Value中的var列)
{
sb.追加(列值+“,”);
}
移除(sb长度-1,1);
(某人);
}
Console.WriteLine(sb.ToString());
控制台写入线(“---”);
}
}
公共静态类LinqExtenions
{
公共静态字典透视(此IEnumerable源、Func firstKeySelector、Func secondKeySelector、Func aggregate)
{
var retVal=新字典();
var l=source.ToLookup(firstKeySelector);
foreach(l中的var项目)
{
var dict=新字典();
retVal.Add(item.Key,dict);
var subdict=item.ToLookup(secondKeySelector);
foreach(子ct中的var子项)
{
dict.Add(subitem.Key,聚合(subitem));
}
}
返回返回;
}
}
}

您是否研究过使用来分隔值?是的,但无法使其工作尝试此方法:我看到过此方法,但只有在您知道轴旋转后将有多少列时,此方法才有效。。。在我的原始列表被填充之前,我永远不知道我的列会是什么样子。你能解释一下时间戳和结束列吗?
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;
    }
}


}