2016-06-27 5 views
0

私はデータ構造として機能するオブジェクトを反復処理しています。構造体はKeyPairValueを含むリストにすぎず、foreachループを使用するときにValueを取得することが可能かどうか疑問に思っています。foreachの戻り値を変更する

+0

いくつかのコードかもしれませんあなたが望むものを説明するのに役立ちます。 – hatchet

+1

'myKeyValuePair.Value' –

+1

いいえ、あなたは' foreach'にそのことを伝えることはできませんが、 'foreach'で反復処理する前にlinq' Select'ステートメントを使ってリストを処理することができます: 'foreach(var値はmylist.Select(t => t.Value)) ' – Blorgbeard

答えて

1

あなたはKとVのための実際のタイプに置き換え、または一般的な機能を作るためにマイナーチェンジのコメントを見ることができます。この

public IEnumerable<V> EnumerateValues(IEnumerable<KeyValuePair<K, V>> list) 
{ 
    foreach (var kv in list) yield return kv.Value; 
} 

のようなものを実装することができます。

+1

これを修正する必要があります:' var kv in list'、また別の問題があります。 'EnumerateValues (List > list)' –

+0

また、 'List'の代わりに' IEnumerable'を使用しないと、もっと一般的になります。 –

+0

@OrelEraki:「var」でキャッチしてくれてありがとう。私はもともと彼が彼の具体的なタイプに潜むことを意味し、彼の経験のレベルに応じてより簡単かもしれません。私はそれを示すために私の応答を更新し、あなたのコメントに彼を指摘してそれを一般的にする。 –

0

Eric Jの回答をさらに拡大するために、カスタムコレクションの仕組みを完全に変更したい場合は、いくつかのことができます。私のデータ構造はすでにプライベートリストを保持していたので、値として渡す必要はありませんでした。次のことは、コレクションを繰り返し処理しても、コレクションから必要なものが返されるようになります。

public IEnumerable<V> EnumerateValues() 
{ 
    foreach (var kv in privateList) yield return kv.Value; 
} 
public IEnumerator<KeyValuePair<K, V>> GetEnumerator() 
{ 
    return EnumerateValues().GetEnumerator(); 
} 
IEnumerator IEnumerable.GetEnumerator() 
{ 
    return GetEnumerator(); 
} 

(私は多くの人が既にこれを知っていると確信しているが、私は私も他の誰かが同様の問題を持っているだけの場合に拡張することが把握ので、私は何かを見つけることができませんでした。)

関連する問題