69

私は次の辞書を持っています:

IDictionary<int, IList<MyClass>> myDictionary 

そして、辞書内のすべての値を IList として取得したいと考えています....


私がどのようにしてこの状況に陥ったかについての背景を少し追加するだけです....

MyClass のリストを取得するメソッドがあります。次に、そのリストをキーが MyClass の ID である辞書に変換する別のメソッドがあります。後で...そしてその元のリストにアクセスすることなく... MyClassのグループ化されていない元のリストを取得する必要があります。


IList を受け取るメソッドに myDictionary.Values.ToList() を渡すと、変換できないというコンパイル エラーが表示されます。

System.Collections.Generic.List<System.Collections.Generic.IList<MyClass>> 

に:

System.Collections.Generic.IList<MyClass>

これで、IList の各グループがなくなって、リストの個別の要素として新しいリストに追加されたことを理解できます....しかし、この例では、実際には私が求めているものではありません。辞書全体のすべての値のリストが必要です。

それでは、辞書の各キー値をループして必要なリストを作成せずに、どうすれば目的を達成できますか?

4

5 に答える 5

119

多くの回答がかなり古いことに気づきました。

これも機能します:

using System.Linq;

dict.Values.ToList();
于 2015-11-10T15:16:17.573 に答える
70

辞書(またはハッシュテーブル)がどのように維持されるかにより、これがあなたが行うことです。内部的には、実装にはキー、バケット(衝突処理用)、および値が含まれています。内部値リストを取得できる場合もありますが、次のようなものを使用した方がよいでしょう。

IDictionary<int, IList<MyClass>> dict;
var flattenList = dict.SelectMany( x => x.Value );

トリックを実行する必要があります;)SelectManyは結果をフラット化します。これは、すべてのリストが1つの長いシーケンス(IEnumerable`1)に連結されることを意味します。

于 2009-02-17T07:18:05.347 に答える
31

ジョンの提案のバリエーション:

var flattenedValues = dict.Values.SelectMany(x => x);

リストにそれらが必要な場合は、もちろんToListを呼び出すことができます。

var flattenedList = dict.Values.SelectMany(x => x).ToList();
于 2009-02-17T07:24:10.857 に答える
2
dictionary.values.toList();

合計を取得したい場合は、

myDictionary.values.sum();
于 2020-05-12T21:53:09.593 に答える
0

ValuesICollection辞書の値を含むを取得します。辞書の定義からわかるように、ICollection<IList<MyClass>>コレクションとして定義できます。したがって、本当に必要な場合は、 spacedogIList<IList<MyClass>>のソリューションを使用してください。

本当に必要なのがフラットな`IList'である場合、各値をループする以外に解決策はありません。

IList<MyClass> l=new List<MyClass>();
foreach (IList<MyClass> v in myDictionary.Values)
    l.AddRange(v);

これは非常に非効率的であるため、達成しようとしていることに対して辞書を使用することをもう一度検討する必要があることに注意してください。

于 2009-02-17T07:22:26.147 に答える