Làm cách nào để có được danh sách các khóa trong Từ điển?


152

Tôi chỉ muốn Chìa khóa chứ không phải Giá trị của Từ điển.

Tôi chưa thể có được bất kỳ mã nào để làm điều này. Sử dụng một mảng khác đã được chứng minh là quá nhiều công việc khi tôi sử dụng loại bỏ cũng.

Làm cách nào để có được Danh sách các Khóa trong Từ điển?

Câu trả lời:


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

6
là cần thiết để sử dụng "này."
JerryGidel

15
@JerryGidel Không, không cần thiết. Nó chỉ đơn giản được sử dụng để xóa nhầm lẫn về việc yourDictionarylà một phần của đối tượng, xuất phát trong hàm hoặc tên một tham số.
bcdan

1
Một câu trả lời đầy đủ hơn sẽ là không cho rằng loại Khóa là một chuỗi. var keyList = yourDipedia.Keys.ToList (); Hoặc nếu bạn muốn sử dụng các loại hạt và không sử dụng var hoặc Linq: - Gõ keyType = yourDipedia.GetType (). GetGenericArgument () [0]; Nhập listType = typeof (Danh sách <>). MakeGenericType (keyType); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDipedia.Keys);
Gian hàng Antony

70

Bạn có thể chỉ cần nhìn vào .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
Và nếu bạn đang loại bỏ các phím trong vòng lặp thì sao?
Martin Capodici

5
@MartinCapodici sau đó bạn thường nên mong đợi trình lặp bị hỏng và từ chối tiếp tục
Marc Gravell

5
Marc, vâng, trong trường hợp đó, bạn sẽ làm một cái gì đó giống như câu trả lời khác và tạo một danh sách mới.
Martin Capodici 10/03/2016

43

Để có danh sách tất cả các khóa

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

System.Linq được hỗ trợ trong .Net framework 3.5 trở lên. Xem các liên kết dưới đây nếu bạn gặp phải bất kỳ vấn đề nào khi sử dụng System.Linq

Visual Studio không nhận ra System.Linq

Hệ thống. Không gian tên


13
Xin đừng quên: using System.Linq;Tôi cần biết câu trả lời nào cần bỏ qua. Xin lỗi :)
Bitterblue

2
Cảm ơn bạn @Bitterblue. Tôi không thể hiểu tại sao .ToList()lại gặp lỗi khi tôi đã sử dụng nó rất nhiều lần khác, vì vậy tôi đã đến đây để tìm câu trả lời và tôi nhận ra tệp tôi đang làm việc không có using System.Linq:)
vẽ

1
không hoạt động:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
Luân xa

thực sự không làm việc sử dụng câu trả lời được chấp nhận thay thế.
aleck

1
@aleck Nó hoạt động rất tốt. Bạn có thể không sử dụng System.Linq như được đề xuất bởi Bitterblue hoặc .Net framework phiên bản bạn đang sử dụng không hỗ trợ nó. Nó được giới thiệu trong .Net framework 3.5, Xem liên kết này . Tôi đang cập nhật câu trả lời để sử dụng System.Linq trước khi sử dụng phương pháp này.
Prem

12

Câu trả lời của Marc Gravell sẽ phù hợp với bạn. myDictionary.Keystrả về một đối tượng mà cụ ICollection<TKey>, IEnumerable<TKey>và họ đối không chung chung.

Tôi chỉ muốn thêm rằng nếu bạn cũng có kế hoạch truy cập giá trị, bạn có thể lặp qua từ điển như thế này (ví dụ sửa đổi):

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

Câu hỏi hơi khó hiểu nhưng tôi đoán rằng vấn đề là bạn đang cố xóa các thành phần khỏi Từ điển trong khi bạn lặp lại các phím. Tôi nghĩ trong trường hợp đó bạn không có lựa chọn nào khác ngoài sử dụng mảng thứ hai.

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

Nếu bạn có thể sử dụng danh sách chung và từ điển thay vì ArrayList thì tôi sẽ làm, tuy nhiên cách trên chỉ nên hoạt động.


2

Tôi không thể tin tất cả những câu trả lời phức tạp này. Giả sử khóa là loại: chuỗi (hoặc sử dụng 'var' nếu bạn là nhà phát triển lười biếng): -

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

Bạn có nghĩa là nó không hoạt động? Từ điển có thuộc tính của các khóa thuộc loại KeyCollection, thực hiện ICollection có phương thức mở rộng ToList <> (). Thêm System.Linq vào câu lệnh 'bằng cách sử dụng' của bạn và bạn sẽ thấy tốt. using System.linq;
Gian hàng Antony

0

Hoặc như thế này:

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

Điều này có tạo ra một bản sao của các phím không? (để bạn có thể liệt kê một cách an toàn)
mcmillab

Đó là viết lại phần mở rộng linq .ToList <T> (). Ngoài ra, Danh sách KeyValuePair là Từ điển. Yêu cầu ban đầu chỉ dành cho một danh sách các Khóa. Việc sử dụng một vòng lặp để cư trú là không cần thiết vì List có một hàm tạo lấy một bộ sưu tập và cũng có một phương thức AddRange () để thêm vào Danh sách hiện có. Xem câu trả lời được chấp nhận.
Gian hàng Antony

0

Đối với một từ điển lai, tôi sử dụng này:

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

-2

Tôi thường sử dụng cái này để lấy khóa và giá trị trong từ điển: (VB.Net)

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

 Next

(layerList thuộc loại Dictionary (Of String, Integer))

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.