2015-03-10 2 views
-1

У меня есть простой пользовательский объект:Список Преобразовать в словарь <String, String []>

class CertQuestion 
{ 
    public string Field {get;set;} 
    public string Value {get;set;} 
} 

Впоследствии я считаю себя со списком в какой-то код. Я пытаюсь выяснить, как отформатировать список CertQuestions в соответствующем словаре с похожими именами полей, сгруппированными вместе. Например, учитывая следующий список:

 List<CertQuestion> certQuestions = new List<CertQuestion>() 
      { 
       new CertQuestion("Key", "Value1"), 
       new CertQuestion("Key", "Value2"), 
       new CertQuestion("Key2", "Value"), 
       new CertQuestion("Key2", "Value2") 
      }; 

Я хотел бы преобразовать, что (пытаясь использовать LINQ) в словарь с двумя записями, такие как

{{"Key", "Value1, Value2"}, {"Key2", "Value, Value2"}} 
+0

Итак, вы хотите «Словарь <строка, список >'? –

+1

Итак, какие проблемы вы создаете для этого словаря? – Servy

+0

'certQuestions.ToLookup (x => x.Field, x => x.Value);' – EZI

ответ

7

Сгруппируйте вопросы по полю, а затем преобразовать в словарь, выбрав ключ, затем значение. Значение становится списком группировки.

certQuestions.GroupBy(c => c.Field) 
      .ToDictionary(k => k.Key, v => v.Select(f => f.Value).ToList()) 

Или для массива:

certQuestions.GroupBy(c => c.Field) 
      .ToDictionary(k => k.Key, v => v.Select(f => f.Value).ToArray()) 

Редактировать основанный на вопрос в комментарии:

class CertTest 
{ 
    public string TestId {get;set;} 
    public List<CertQuestion> Questions {get;set;} 
} 
var certTests = new List<CertTest>(); 

Вы могли бы использовать метод расширения SelectMany. Он предназначен для агрегирования объект списка свойств, которое в каждом элементе исходного списка:

certTests.SelectMany(t => t.Questions) 
     .GroupBy(c => c.Field) 
     .ToDictionary(k => k.Key, v => v.Select(f => f.Value).ToList()) 
+2

Не совсем верно, это даст вам словарь > '. Вам нужно «Выбрать» значение «Значение». Что-то вроде '.ToDictionary (k => k.Key, v => v.Select (cq => cq.Value) .ToList())' –

+0

Да, вы правы, пропустили тип строки и тип CertQuestion в желаемом результате , – rclement

+0

Кажется, что это так просто после того, как кто-то объяснил, как это сделать. Просто из любопытства, что, если бы у меня был список объектов, и у каждого объекта был List , как я мог бы обернуть все поля объектов в один словарь ? – Nate222

3

Ваше требование для разделенных запятыми список значений, что может быть сделано, как это:

var dict = certQuestions.GroupBy(c => c.Field) 
      .ToDictionary(k => k.Key, v => String.Join(", ", v.Select(x => x.Value))) 

Живого пример: http://rextester.com/LXS58744

(вы должны рассмотреть вопрос о том, что вы на самом деле хотите значение быть Array или List<string> - см других ответов)

Смежные вопросы