2010-12-01 6 views
5

私は一定の基準が他への移行を満たしている場合、私は1つの辞書にオブジェクトをチェックする必要があり、簡単なタスクを持っています。私はそれを達成するために言語機能を使うことができる良いパターンがあるかどうか尋ねています。まっすぐアプローチは簡単です - 一時的なコレクションを使用して、最初のステップはcanditatesを決定し、2番目のステップは実際の動きを行います。それは大丈夫ですが、それはクールではありません。辞書間でオブジェクトを移動するにはどうすればよいですか?

現在のコード

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

答えて

7

あなたが持っているコードで、本当に間違っては何もありません。代替案では練習として

レックスMの答えが適切でない場合は、あなたが何かのような...

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

を試してみてください。コメントアニとしては、他の似解決策がありますあなたが本当に '選択 'ではなく'どこで 'を使用したいと思っているかを感じます。 'ToDictionary'への入力はたぶん' bool'値なので、コードが今のようにコンパイルされるのではないかと思います。 –

+0

@Fredrik ha!あなたは、長い一日:) –

+0

正しい...と私のupvoteがあります:) –

3

を行うことができます(多分あなたは、各iteartionに辞書を再構築する必要はありません) 、その後、小さな改善と私は

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

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

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

を交換することをお勧めすることができます

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

UPDあなたのコードの残りの部分は次のようになります。

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

foreach(var item in processed) 
{ 
    ActiveDictionary.Remove(item); 
    ProcessedDictionary.Add(item.Id, item); 
} 
+0

私はこの答えが好きです。コードの目的は、「このようなすべての要素を見つけて、辞書から削除/追加してください」 – mlibby

+0

LINQが大好きです。しかし、時にはそれはただの場所ではありません。この答えはそのような場合です:LINQの小さな混合の古いスタイルは、はるかに読みやすい完全LINQスタイルです。 –

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

.Select(kv => kv.Key)を実行しないと、ActiveDictionaryで値を検索する必要はありません(Foreachで項目を追加する場合)。 –

関連する問題