2

私が次のようなものを持っている場合:

Dictionary<SomeObject, SomeOtherObject> _mydictionary 

SomeObjectメソッドがあります:SomeMethod()

SomeMethod()キーをリストに変換してForEachを実行せずに、ラムダ式を使用してメソッドを呼び出すにはどうすればよいですか。はToList()高すぎる。または、ラムダで次のものと同等です。

foreach(SomeObject o in _mydictionary.Keys)
  o.SomeMethod();

???

私は試した:

_mydictionary.ToList().ForEach(x => x.SomeMethod());

しかし、これは高すぎるようですToList();

4

2 に答える 2

1

Reactive Extensions (Rx)を使用します。

var keys = _mydictionary.Keys;
// convert the enumerable sequence of keys to an observable sequence
var observableKeys = keys.ToObservable ();
// invoke SomeMethod for each key
await observableKeys.ForEachAsync (obj =>
    obj.SomeMethod ());

このコードは、最初の SomeMethod を呼び出す前にシーケンスを列挙する呼び出しをブロックせずに実行され、別のコレクションを割り当てません。

残念ながら、列挙可能なシーケンスから監視可能なシーケンスに変換する必要なく、まったく同じ機能を持つ Interactive Extensions (Ix) の新しいリリースを待っています。

于 2012-08-22T02:58:45.427 に答える
1

voidオブジェクトのコレクションのデリゲートまたはメンバーのいずれであっても、メソッドのコレクションを呼び出す組み込みの拡張メソッドはありません。

ただし、比較的簡単に作成できます。

public static void ForEach<T>(this IEnumerable<T> items, Action<T> action)
{
  foreach (var item in items) action(item);
}

これで、LINQ のような方法でこれらすべてのメソッドを呼び出すことができます。

_mydictionary.Keys.ForEach(x => x.SomeMethod());

.Keysのコレクション プロパティには既にアクセスできますIDictionary<TKey,TValue>.ToList()どこにも電話する必要はありません。


が関数で、結果セットを作成する場合SomeMethod()は、組み込みの拡張メソッドを使用できますSelect()

var results = _mydictionary.Keys.Select(x => x.SomeMethod());

ジョージが正しく指摘しているように、SomeMethod()必要でない限り、つまり、結果を反復処理して実際に使用しない限り、呼び出されません。これにより、新しいコレクションを作成するオーバーヘッドを回避できますが、複数の列挙を避けるように注意する必要があります。

于 2012-08-22T00:33:56.693 に答える