Как переместить объект между словарями? - PullRequest
5 голосов
/ 01 декабря 2010

У меня есть простая задача, где мне нужно проверить объекты в одном словаре и, если определенные критерии соответствуют, перейти к другому. Что я спрашиваю, есть ли хороший пример, где я могу использовать языковую функцию для достижения этой цели. Прямой подход прост - используйте временную коллекцию, первый шаг - определение кандидатов, второй шаг - фактический ход. Это нормально, но не круто.

Текущий код

class Order
{
  public int ID;
  public bool IsReady;
}

Dictionary<int, Order> ActiveDictionary;
Dictionary<int, Order> ProcessedDictionary;

public Update()
{    
 // temporary list, uncool
 List<Order> processed = new List<Order>();


 // fist step
 foreach(Order ord in ActiveDictionary)
 {
  if(ord.IsReady)
  {
    processed.Add(ord);
  }
 }

 // ok now lets move
 foreach(Order ord in processed)
 {
  ActiveDictionary.Remove(ord.ID);
  ProcessedDictionary.Add(ord.ID, ord);
 }
}

Ответы [ 3 ]

7 голосов
/ 01 декабря 2010

Нет ничего плохого в том, что у вас есть код.

В качестве альтернативы вы можете сделать что-то вроде ...

ProcessedDictionary = ProcessedDictionary
    .Concat(
        ActiveDictionary.Where(kvp => kvp.Value.Ready)
    )
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

ActiveDictionary = ActiveDictionary.Where(kvp => !kvp.Value.Ready)
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
3 голосов
/ 01 декабря 2010

если Rex M ответ не подходит (может быть, вы не хотите перестраивать словари для каждого года), то в качестве небольшого улучшения я могу предложить заменить

// temporary list, uncool
List<Order> processed = new List<Order>();

// fist step
foreach(Order ord in ActiveDictionary)
{
  if(ord.IsReady)
  {
     processed.Add(ord);
  }
}

to

var processed = ActiveDictionary.Where(x=>x.Value.Ready).ToArray();

, а остальная часть вашего кода будет

foreach(var item in processed)
{
   ActiveDictionary.Remove(item.Key);
   ProcessedDictionary.Add(item.Key, item.Value);
}

UPD: Как прокомментировал Ani , существует другое похожее решение:

var processed = ActiveDictionary.Values.Where(x=>x.Ready).ToArray();

foreach(var item in processed)
{
   ActiveDictionary.Remove(item);
   ProcessedDictionary.Add(item.Id, item);
}
1 голос
/ 01 декабря 2010

попробуйте

var keys = ActiveDictionary
    .Where(kv => kv.Value.Ready)
    .Select(kv => kv.Key).ToList();
keys.ForEach(k =>
        {
            ProcessedDictionary.Add(k, ActiveDictionary[k]);
            ActiveDictionary.Remove(k);
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...