2010-10-18 2 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; } 
} 

Извините, если я не высказываю эту проблему ясно, пожалуйста, задавайте любые вопросы, которые вы хотели бы, и заранее спасибо за любую помощь ...

EDITED TO ADD EXAMPLE

+0

Звучит как своего рода транспозиции. 'Enumerable.ToLookup' может быть вам нужно :) – leppie

+0

С другой стороны, почему бы не создать пользовательский словарь, который инкапсулирует транспонированный вид? Значение, при вставке/обновлении/удалении, вы можете изменить альтернативный вид. Если это всего лишь одноразовая процедура, решение LINQ, вероятно, будет более элегантным. – leppie

+0

Типы словарей для меня совершенно не понятны. Короткий, но полный пример был бы очень полезен. –

ответ

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

Я закончил тем, что использовал этот! –

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() 
     ) 
Смежные вопросы