2009-05-06 9 views
5

私は辞書から削除するキーと辞書のリストを持っています。これは今私の実装です:LINQを使用して辞書を「剪定」するにはどうすればよいですか?

var keys = (from entry in etimes 
      where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime) 
      select entry.Key).ToList(); 

foreach (var key in keys) 
{ 
    etimes.Remove(key); 
    count--; 
} 

私はforeachループを排除することができますか?

+1

ところで、.ToList()foreachはIEnumerableで動作します –

+0

LINQはクエリ言語であり、既存のデータを変換して新しいデータを作成できます。既存のデータを変更することはできません。 – codymanix

答えて

6
var pruned = etimes.Where(entry => Convert.ToInt64(entry.Value) >= 
    Convert.ToInt64(stime)).ToDictionary(entry => entry.Key, 
     entry => entry.Value); 

この文は、単純に(あなたが示したように、その後、さらにコードを必要とする)に項目を削除するには、それらのではなく、を続けるかを選択するためにLINQ Where機能を使用して辞書をフィルタリングします。 ToDictionaryIEnumerable<KeyValuePair<TKey, TValue>>のタイプを希望のDictionary<TKey, TValue>タイプに変換し、KeyValuePairからキーと値を選択するために2つのラムダ式を指定する必要があるため、非常に上品で効率的でない場合は、少なくともかなり単純です(新しい辞書を作成する)。これを言って、私は実際にそれが問題であるとは思わない、特に辞書が小さく、削除されるアイテムの数が多い場合。余談

+0

途中でパフォーマンスにコメントしたくない場合は、気にするなら2つの方法を試してみてください。 foreachを使用しているあなたのオリジナルのソリューションがもっと速く*なるかどうかはわかりません。 – Noldorin

+0

私はパフォーマンスについて心配していません、いつでも辞書にいくつかのキーがあります。私はちょうどLINQのより良い取り扱いをしようとしています。ありがとう、これは素晴らしい仕事。 – scottm

+0

これは、新しい辞書を作成するので、各ループの単純なものよりはるかに高価になる可能性があります。また、読みやすさも向上しないと思います。だから私は各ループのために固執し、おそらく(拡張)メソッドに移動するが、私はLINQソリューションのためのすべての勝利を参照してください。 –

0

まあ、パフォーマンスや読みやすさの問題は、これはまた、次のような何かを行うことができませんでした。

<Extension> void itemDelete(List l, object item) { 
    l.Remove(item) 
} 

var keys = (from entry in etimes 
     where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime) 
     select entry.Key).ToList(); 

keys.foreach(itemDelete()); 

私のコーディングを許し、私は特にC#で(正確な構文の100%かどうか分かりません);その疑似コードを考えてみましょう。 新しい関数が追加され、LINQクエリの最後に関数が追加されます(.foreach)。 私はこれがVBで可能であることを知っています。私はC#に何か似たものがあると仮定します...もしあなた自身が常に.foreachエクステンションを書くことができます。 これは改善する場合もあれば改善しない場合もありますが、それはいい考えです。

+0

これはちょっと疑問ですが、部分的なクラスでこの拡張メソッドを作成しても構いませんか?私はまだエクステンションメソッドとそれをどのように使用して作成できるかを把握しようとしています。 – Jagd

+0

@ Jagd:これは、部分クラスを使用する理由は何もありません。推奨されるのは、静的クラス*内でそれらを単独で宣言し、同様の機能を持つ静的クラスにグループ拡張メソッドをグループ化することです。 – Noldorin

+0

VBではモジュールで作成するので、Noldorinのベストプラクティスを聞いてみましょう。 – eidylon

関連する問題