如何在字典之间移动对象?

时间:2010-12-01 12:20:14

标签: c# .net algorithm collections

我有一个简单的任务,我需要检查一个字典中的对象,以及是否满足某些条件移动到另一个字典。我问的是,如果有一些好的模式,我可以使用语言功能来实现这一点。直接的方法很简单 - 使用临时收集,第一步确定canditates,第二步做实际移动。没关系,但这并不酷。

当前代码

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 个答案:

答案 0 :(得分:7)

您的代码没有任何问题。

作为替代方案的练习,你可以做类似的事情......

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

答案 1 :(得分:3)

如果 Rex M 的答案不合适(也许你不想在每次重复时重建字典),那么作为小改进我可以建议更换

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

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

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

答案 2 :(得分:1)

试试这个

var keys = ActiveDictionary
    .Where(kv => kv.Value.Ready)
    .Select(kv => kv.Key).ToList();
keys.ForEach(k =>
        {
            ProcessedDictionary.Add(k, ActiveDictionary[k]);
            ActiveDictionary.Remove(k);
        });