2013-12-06 3 views
-1

У меня есть список этих объектов, которые я хотел бы преобразовать в словарь:список Преобразовать в словарь

public class Thing 
{ 
    public Guid ParentKey { get; set; } 
    public int Position { get; set; } 
    public bool Unconfigured { get; set; } 
    public void Replace(Thing thing); 
} 

Я хотел бы ключ и значение, чтобы быть объектами Thing, где ParentKey и положение одинаковы , Ключевой объект должен иметь Unconfigured, установленный в true, и значение будет представлять собой дочерний объект, который имеет тот же ParentKey и Position, но ложное состояние Unconfigured. Я пытаюсь создать пары объектов, которые имеют один и тот же ParentKey, Position, но имеют разные Unconfigured состояния.

Пример:

var things = new List<Thing>(); 
things.Add(new Thing { ParentKey = new Guid("8a1211d2-f42b-4dd2-b6a3-7f4ab4a44a8d"), Position = 1, Unconfigured = true }); 
things.Add(new Thing { ParentKey = new Guid("8a1211d2-f42b-4dd2-b6a3-7f4ab4a44a8d"), Position = 1, Unconfigured = false }); 
things.Add(new Thing { ParentKey = new Guid("35f22dba-7789-49f4-8982-c9ea075175cc"), Position = 2, Unconfigured = false }); 

Я ожидаю, что словарь с одного пункта. Ключ для этого элемента - это первый добавленный объект, а значение - это вторая добавленная вещь.

предполагаемое использование этого вызвать метод замены:

foreach (var entry in things) 
{ 
    entry.Key.Replace(entry.Value);          
} 

Словарь не может быть подходящим объектом для этого, я открыт для других предложений.

+3

Каким будет ваш словарь? – Habib

+0

list.ToDictionary (x => x.key, x => x.value); – Konstantin

+0

Я хочу, чтобы ключ был самим объектом. – Robert

ответ

1

Я думаю, что вы, возможно, придется прибегнуть к петле Еогеасп, вы можете попробовать этот код:

List<Thing> things = new List<Thing>(); 
Dictionary<Thing, Thing> dictionary = new Dictionary<Thing,Thing>(); 

var keys = from thing in things 
      where thing.Unconfigured 
      select thing; 

var values = from thing in things 
      where !thing.Unconfigured 
      select thing; 

foreach (Thing key in keys) 
{ 
    var value = (from thing in values 
       where thing.ParentKey == key.ParentKey && 
         thing.Position == key.Position 
       select thing).FirstOrDefault(); 
    dictionary.Add(key, value); 
} 

Конечно код предполагает, что у вас есть только пар в Списке, если может быть больше пары объектов, связанных с описанным вами описанием, потребуется ревизия

2

Попробуйте это решение:

var dic = things.ToDictionary(
    t => new Thing 
    { 
     ParentKey = t.ParentKey, 
     Position = t.Position, 
     Unconfigured = true 
    }, 
    t => new Thing 
    { 
     ParentKey = t.ParentKey, 
     Position = t.Position, 
     Unconfigured = false 
    } 
); 
+0

Это не учитывает ParentKey – Robert

+0

Извините, что вы имеете в виду? – alexmac

+0

В чем смысл создания «новой вещи»? вы можете просто делать что-то.ToDictionary (t => t) ' – Konstantin

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