2010-10-18 25 views
1

我有布局,像这样一本字典:问题转化词典使用LINQ

Dictionary<string, List<Series>> example = new Dictionary<string, List<Series>>(); 

     example.Add("Meter1",new List<Series>(){ new Series{ name="Usage", data = new double[] {1,2,3}}, 
      new Series{ name = "Demand", data= new double[]{4,5,6}}}); 

     example.Add("Meter2", new List<Series>(){ new Series{ name="Usage", data = new double[] {1,2,3}}, 
      new Series{ name = "Demand", data= new double[]{4,5,6}}}); 

我需要的是:

 Dictionary<string, List<Series>> exampleResult = new Dictionary<string, List<Series>>(); 

     exampleResult.Add("Usage", new List<Series>(){ new Series{ name="Meter1", data = new double[] {1,2,3}}, 
      new Series{ name = "Meter2", data= new double[]{1,2,3}}}); 

     exampleResult.Add("Demand", new List<Series>(){ new Series{ name="Meter1", data = new double[] {4,5,6}}, 
      new Series{ name = "Meter2", data= new double[]{4,5,6}}}); 

也就是说,辞典投影的“杯酒人生”,与每个系列的名称作为新字典中的关键字,并将旧字典的关键字用作系列的名称。

这里的一系列类...

public class Series 
{ 
    public string name { get; set; } 
    public double[] data { get; set; } 
} 

很抱歉,如果我没有表达清楚这个问题,请向你喜欢的任何问题,并在此先感谢您的帮助......

编辑添加示例

+0

听起来像是某种换位。 'Enumerable.ToLookup'可能是你需要的:) – leppie 2010-10-18 13:29:57

+0

第二个想法,为什么不创建一个自定义字典,封装转置视图?意思是,在插入/更新/删除时,您可以修改替代视图。如果它只是一次性的过程,那么LINQ解决方案可能会更加优雅。 – leppie 2010-10-18 13:31:49

+0

字典类型对我来说并不完全清楚。一个简短但完整的例子将非常有用。 – 2010-10-18 13:32:43

回答

3

创建一个分组,然后选择新的键和值来创建字典。就像这样:

// source data 
var d = new Dictionary<string, Series[]> 
      { 
       { 
        "key1", new[] 
           { 
            new Series 
             { 
              name = "Usage", 
              data = new double[] {1, 2, 3} 
             }, 
            new Series 
             { 
              name = "Demand", 
              data = new double[] {4, 5, 6} 
             } 
           } 
        }, 
       { 
        "key2", new[] 
           { 
            new Series 
             { 
              name = "Usage", 
              data = new double[] {1, 2, 3} 
             }, 
            new Series 
             { 
              name = "Demand", 
              data = new double[] {4, 5, 6} 
             } 
           } 
        } 
      }; 

// transform 
var y = (
      from outer in d 
      from s in outer.Value 
      let n = new 
         { 
          Key = s.name, 
          Series = new Series 
             { 
              name = outer.Key, 
              data = s.data 
             } 
         } 
      group n by n.Key 
      into g 
      select g 
     ).ToDictionary(g1 => g1.Key, 
         g2 => g2.Select(g3 => g3.Series).ToArray()); 


/* results: 
var y = new Dictionary<string, Series[]> 
      { 
       { 
        "Usage", 
        new[] 
         { 
          new Series 
           { 
            name = "key1", 
            data = new double[] { 1, 2, 3 } 
           }, 
          new Series 
           { 
            name = "key2", 
            data = new double[] { 1, 2, 3 } 
           } 
         } 
        }, 
       { 
        "Demand", 
        new[] 
         { 
          new Series 
           { 
            name = "key1", 
            data = new double[] {4, 5, 6}, 
           }, 
          new Series 
           { 
            name = "key2", 
            data = new double[] {4, 5, 6} 
           } 
         } 
        } 
      }; 
*/ 
+0

我最终使用了这个! – 2010-10-18 20:47:32

1

试试这个:

example 
     .SelectMany(x => x.Value 
      .Select(y => y.name) 
     ).Distinct() 
     .ToDictionary(
      x => x, 
      x => example 
      .SelectMany(y => y.Value 
       .Where(z => z.name == x) 
       .Select(z => new Series{ name = y.Key, data = z.data }) 
      ).ToList() 
     )