辞書のキーのリストを取得するにはどうすればよいですか?


152

私はキーだけが必要で、辞書の値は必要ありません。

これを行うコードをまだ取得できていません。別の配列を使用すると、私も削除を使用するので、作業量が多すぎることがわかりました。

辞書のキーのリストを取得するにはどうすればよいですか?

回答:


305
List<string> keyList = new List<string>(this.yourDictionary.Keys);

6
「これ」を使う必要がありますか
JerryGoyal 2015

15
@JerryGoyalいいえ、必要ありません。これはyourDictionary、関数で派生したオブジェクトの一部であるか、パラメーターの名前であるかについての混乱を明確にするために単に使用されます。
bcdan 2015年

1
より完全な答えは、キータイプが文字列であると想定しないことです。var keyList = yourDictionary.Keys.ToList(); あるいは、varやLinqを使用せずに一生懸命したい場合:-Type keyType = yourDictionary.GetType()。GetGenericArguments()[0]; タイプlistType = typeof(List <>)。MakeGenericType(keyType); IList keyList =(IList)Activator.CreateInstance(listType); keyList.AddRange(yourDictionary.Keys);
アントニーブース

70

あなたはただ見ることができるはずです.Keys

    Dictionary<string, int> data = new Dictionary<string, int>();
    data.Add("abc", 123);
    data.Add("def", 456);
    foreach (string key in data.Keys)
    {
        Console.WriteLine(key);
    }

2
そして、ループ内のキーを削除している場合はどうなりますか?
Martin Capodici 2016年

5
@MartinCapodiciその後、あなたは通常、イテレータが破損すると、ごみを継続することを期待すべきである
マルクGravell

5
マルク、そうです。その場合、他の答えのようなことをして、新しいリストを作成します。
Martin Capodici 2016年

43

すべてのキーのリストを取得するには

using System.Linq;
List<String> myKeys = myDict.Keys.ToList();

System.Linqは、.Net Framework 3.5以降でサポートされています。System.Linqの使用で問題が発生した場合は、以下のリンクを参照してください

Visual StudioがSystem.Linqを認識しない

System.Linq名前空間


13
忘れないでくださいusing System.Linq;。無視する答えを知る必要があります。申し訳ありません:)
Bitterblue

2
@Bitterblueありがとうございます。.ToList()何度も何度も使用したときにエラーが発生する理由が理解できなかったので、答えを探してここに来て、作業しているファイルに次のようなものがないことに気づきましたusing System.Linq:)
Drew

1
動作しません:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
サクラ

確かに機能しません。代わりに、受け入れられた回答を使用してください。
aleck

1
@aleckそれは素晴らしい働きをします。使用しているBitterblueまたは.Netフレームワークのバージョンでサポートされていないため、System.Linqを使用していない可能性があります。.Net framework 3.5で導入されました。このリンクを参照してください。このメソッドを使用する前に、System.Linqを使用するように回答を更新しています。
プレミア

12

Marc Gravellの答えがうまくいくはずです。myDictionary.Keysその実装するオブジェクトを返しICollection<TKey>IEnumerable<TKey>そしてその非ジェネリック対応。

値にアクセスする予定がある場合は、次のようにディクショナリをループすることもできます(変更した例)。

Dictionary<string, int> data = new Dictionary<string, int>();
data.Add("abc", 123);
data.Add("def", 456);

foreach (KeyValuePair<string, int> item in data)
{
    Console.WriteLine(item.Key + ": " + item.Value);
}

3

質問は理解するのが少し難しいですが、問題は、キーを繰り返し処理しながら、辞書から要素を削除しようとしていることだと思います。その場合は、2番目の配列を使用するしかないと思います。

ArrayList lList = new ArrayList(lDict.Keys);
foreach (object lKey in lList)
{
  if (<your condition here>)
  {
    lDict.Remove(lKey);
  }
}

ArrayListの代わりに一般的なリストと辞書を使用できる場合、私はそうしますが、上記はうまくいくはずです。


2

これらすべての複雑な答えを信じることはできません。キーのタイプが文字列であると想定します(または、遅延開発者の場合は 'var'を使用します):-

List<string> listOfKeys = theCollection.Keys.ToList();

それが機能しないとはどういう意味ですか?辞書には、KeyCollection型のキーのプロパティがあり、ToList <>()拡張メソッドを持つICollectionを実装します。System.Linqを「using」ステートメントに追加すれば、問題ありません。 using System.linq;
Antonyブース

0

またはこのように:

List< KeyValuePair< string, int > > theList =
    new List< KeyValuePair< string,int > >(this.yourDictionary);

for ( int i = 0; i < theList.Count; i++)
{ 
  // the key
  Console.WriteLine(theList[i].Key);
}

これはキーのコピーを作成しますか?(安全に列挙できるように)
mcmillab

これは.ToList <T>()linq拡張子を書き換えています。また、KeyValuePairのリストはディクショナリです。元のリクエストは、キーのリストのみでした。Listにはコレクションを取得するコンストラクターがあり、既存のListに追加するAddRange()メソッドもあるため、ループを使用してデータを取り込む必要はありません。受け入れられた答えを見てください。
アントニーブース

0

ハイブリッド辞書の場合、これを使用します。

List<string> keys = new List<string>(dictionary.Count);
keys.AddRange(dictionary.Keys.Cast<string>());

-2

私はよくこれを使って辞書内のキーと値を取得しました:(VB.Net)

 For Each kv As KeyValuePair(Of String, Integer) In layerList

 Next

(layerListのタイプはDictionary(Of String、Integer)です)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.