代码之家  ›  专栏  ›  技术社区  ›  Chris McCall

用Linq转换词典的问题

  •  1
  • Chris McCall  · 技术社区  · 14 年前

    我有一本字典是这样写的:

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

    很抱歉,如果我没有把这个问题说清楚,请问任何你想问的问题,并提前感谢任何帮助。。。

    编辑以添加示例

    2 回复  |  直到 14 年前
        1
  •  3
  •   Samuel Neff    14 年前

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

    // 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}
                                    }
                            }
                        }
                };
    */
    
        2
  •  1
  •   diceguyd30    14 年前

    试试这个:

        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()
            )