Sözlükteki anahtarların listesini nasıl edinebilirim?


152

Ben sadece anahtarlar istiyorum, bir sözlüğün değerleri değil.

Bunu yapmak için henüz herhangi bir kod alamadım. Kaldırmayı kullandığım için başka bir dizi kullanmak çok fazla iş olduğunu kanıtladı.

Sözlükteki Anahtarların Listesini nasıl edinebilirim?

Yanıtlar:


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

6
"Bunu" kullanmak gerekli midir?
JerryGoyal

15
@JerryGoyal Hayır, gerekli değil. İşlevde yourDictionaryveya bir parametre adında türetilen nesnenin bir parçası olup olmadığı konusundaki karışıklığı temizlemek için kullanılır .
bcdan

1
Daha eksiksiz bir cevap, Anahtar türünün bir dize olduğunu varsaymamak olacaktır. var keyList = yourDictionary.Keys.ToList (); Veya fındık gitmek ve var veya Linq kullanmak istemiyorsanız: - Type keyType = yourDictionary.GetType (). GetGenericArguments () [0]; ListType = typeof (List <>) yazın. MakeGenericType (keyType); IList keyList = (IList) Aktivatör.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
Antony Booth

70

Sadece şunlara bakabilmelisiniz .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
Peki döngüdeki anahtarları kaldırıyorsanız?
Martin Capodici

5
@MartinCapodici o zaman genellikle yineleyicinin kırılmasını ve devam etmeyi reddetmesini beklemelisiniz
Marc Gravell

5
Marc, evet, bu durumda diğer cevap gibi bir şey yapar ve yeni bir liste yaratırsınız.
Martin Capodici

43

Tüm tuşların listesini almak için

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

System.Linq, .Net framework 3.5 veya üstü sürümlerde desteklenir. System.Linq kullanımında herhangi bir sorunla karşılaşırsanız aşağıdaki bağlantılara bakın.

Visual Studio System.Linq'i tanımıyor

System.Linq Ad Alanı


13
Lütfen unutma: using System.Linq;Hangi cevapları görmezden geleceğimi bilmeliyim. Üzgünüm :)
Bitterblue

2
Teşekkürler @Bitterblue. .ToList()Diğer birçok kez kullandığımda neden bir hata atıldığını anlayamıyordum , bu yüzden buraya bir cevap aramaya geldim ve çalıştığım dosyanın olmadığını anladım using System.Linq:)
Drew

1
çalışmıyor:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
sakra

gerçekten çalışmıyor. bunun yerine kabul edilen cevabı kullanın.
aleck

1
@aleck Harika çalışıyor. System.Linq'i Bitterblue tarafından önerilen şekilde kullanmamış olabilirsiniz veya kullandığınız .Net framework sürümü desteklemiyordur. Net framework 3.5'te tanıtıldı. Bu bağlantıya bakın . Bu yöntemi kullanmadan önce System.Linq kullanmak için yanıt güncelleştiriyorum.
prem

12

Marc Gravell'in cevabı sizin için çalışmalı. myDictionary.Keysbunu uygulayan bir nesne döndürür ICollection<TKey>, IEnumerable<TKey>ve bunların genel olmayan muadilleri.

Ben sadece değere de erişmeyi planlıyorsanız, böyle sözlük (döngü örneği) üzerinden döngü olabilir eklemek istedim:

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

Soruyu anlamak biraz zor ama sorun, anahtarlar üzerinde yineleme yaparken sözlükten öğeleri kaldırmaya çalıştığınızı tahmin ediyorum. Bu durumda ikinci bir dizi kullanmaktan başka çareniz olmadığını düşünüyorum.

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

Bir ArrayList yerine genel listeler ve sözlükler kullanabilirsiniz, ancak ben yukarıdaki, sadece çalışması gerekir.


2

Bütün bu kıvrımlı cevaplara inanamıyorum. Anahtarın tür olduğunu varsayarsak: string (veya tembel bir geliştiriciyseniz 'var' kullanın): -

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

Ne işe yaramaz demek istiyorsun? Bir Sözlük, bir ToList <> () uzantı yöntemi olan ICollection uygulayan KeyCollection türünde bir anahtar özelliğine sahiptir. 'Using' ifadelerinize System.Linq ekleyin ve iyi olmalısınız. using System.linq;
Antony Booth

0

Veya bunun gibi:

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);
}

bu anahtarların bir kopyasını oluşturuyor mu? (böylece güvenle numaralayabilirsiniz)
mcmillab

Bu, .ToList <T> () linq uzantısını yeniden yazmaktır. Ayrıca, KeyValuePair listesi bir sözlüktür. Orijinal istek yalnızca Anahtarların listesi içindi. Listede bir koleksiyon alan bir yapıcı ve varolan bir Listeye eklemek için AddRange () yöntemi olduğundan, doldurmak için bir döngü kullanmak gereksizdir. Kabul edilen cevaba bakınız.
Antony Booth

0

Karma bir sözlük için şunu kullanıyorum:

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

-2

Bunu sık sık bir sözlük içindeki anahtar ve değeri almak için kullandım: (VB.Net)

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

 Next

(layerList, Dictionary (Of String, Integer) türündedir)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.