ฉันจะรับรายการคีย์ในพจนานุกรมได้อย่างไร


152

ฉันต้องการแค่คีย์เท่านั้นไม่ใช่ค่าของพจนานุกรม

ฉันยังไม่สามารถรับรหัสเพื่อทำสิ่งนี้ได้ การใช้อาร์เรย์อื่นที่พิสูจน์แล้วว่าทำงานได้มากเกินไปเมื่อฉันใช้การลบ

ฉันจะรับรายชื่อของคีย์ในพจนานุกรมได้อย่างไร

คำตอบ:


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

6
จำเป็นหรือไม่ที่จะใช้ "สิ่งนี้"
JerryGoyal

15
@JerryGoyal ไม่ไม่จำเป็น มันถูกใช้เพื่อล้างความสับสนเกี่ยวกับว่าyourDictionaryเป็นส่วนหนึ่งของวัตถุที่ได้มาในฟังก์ชั่นหรือชื่อพารามิเตอร์
bcdan

1
คำตอบที่สมบูรณ์มากขึ้นคือการไม่ถือว่าประเภทคีย์เป็นสตริง var keyList = yourDictionary.Keys.ToList (); หรือถ้าคุณต้องการที่จะไปถั่วและไม่ใช้ var หรือ Linq: - พิมพ์ keyType = yourDictionary.GetType () GetGenericArguments () [0]; พิมพ์ listType = typeof (รายการ <>) MakeGenericType (keyType); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
Antony Booth

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

5
@MartinCapodici จากนั้นคุณควรคาดหวังให้ตัววนซ้ำหยุดและปฏิเสธที่จะดำเนินการต่อ
Marc Gravell

5
มาร์คใช่ในกรณีนั้นคุณต้องทำอะไรเช่นคำตอบอื่น ๆ และสร้างรายการใหม่
Martin Capodici

43

เพื่อรับรายการคีย์ทั้งหมด

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

System.Linq ได้รับการสนับสนุนใน. Net Framework 3.5 หรือสูงกว่า ดูลิงค์ด้านล่างหากคุณประสบปัญหาใด ๆ ในการใช้ System.Linq

Visual Studio ไม่รู้จัก System.Linq

System.Linq Namespace


13
โปรดอย่าลืม: using System.Linq;ฉันจำเป็นต้องรู้คำตอบที่จะไม่สนใจ ขออภัย :)
Bitterblue

2
ขอบคุณ @Bitterblue ผมไม่เข้าใจว่าทำไม.ToList()ถูกขว้างปาข้อผิดพลาดเมื่อฉันได้ใช้มันครั้งอื่น ๆ อีกมากมายดังนั้นผมมาที่นี่มองหาคำตอบและฉันรู้ว่าไฟล์ที่ผมทำงานในไม่ได้มีusing System.Linq:)
ดึง

1
ไม่ทำงาน:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
Sakra

ไม่ทำงานแน่นอน ใช้คำตอบที่ยอมรับแทน
อวดดี

1
@aleck มันใช้งานได้ดี คุณอาจไม่ได้ใช้ System.Linq ตามที่แนะนำโดย Bitterblue หรือ. Net Framework version ที่คุณใช้ไม่รองรับ มันได้รับการแนะนำในกรอบสุทธิ 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

คำถามเป็นเรื่องยุ่งยากเล็กน้อยที่จะเข้าใจ แต่ฉันเดาว่าปัญหาคือคุณกำลังพยายามลบองค์ประกอบออกจากพจนานุกรมในขณะที่คุณทำซ้ำแป้น ฉันคิดว่าในกรณีนี้คุณไม่มีทางเลือกนอกจากใช้อาเรย์ที่สอง

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

หากคุณสามารถใช้รายการและพจนานุกรมทั่วไปแทนที่จะเป็น ArrayList ฉันก็จะทำอย่างไรก็ตามสิ่งที่กล่าวมาข้างต้นควรจะใช้ได้


2

ฉันไม่อยากจะเชื่อคำตอบที่ซับซ้อนเหล่านี้ทั้งหมด สมมติว่าคีย์เป็นประเภท: string (หรือใช้ 'var' หากคุณเป็นนักพัฒนาที่ขี้เกียจ): -

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

คุณหมายถึงอะไรมันไม่ทำงาน พจนานุกรมมีคุณสมบัติของคีย์ที่เป็นประเภท KeyCollection ซึ่งใช้ ICollection ที่มีวิธีการขยาย ToList <> () เพิ่ม System.Linq ให้กับคำสั่ง 'ใช้' ของคุณและคุณควรจะดี using System.linq;
แอนโทนีบูธ

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 นอกจากนี้ List of KeyValuePair ยังเป็นพจนานุกรม คำขอเดิมมีไว้สำหรับรายการของคีย์เท่านั้น การใช้การวนซ้ำเพื่อเติมข้อมูลนั้นไม่จำเป็นเนื่องจากรายการมีตัวสร้างที่รับคอลเลกชันและยังมีเมธอด AddRange () เพื่อเพิ่มลงในรายการที่มีอยู่ ดูคำตอบที่ยอมรับได้
Antony Booth

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 เป็นประเภทพจนานุกรม (Of String, จำนวนเต็ม))

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.