사전에서 키 목록을 어떻게 얻습니까?


152

사전의 값이 아닌 키만 원합니다.

아직이 코드를 얻을 수 없었습니다. 다른 배열을 사용하면 remove를 사용할 때 너무 많은 작업이 수행됩니다.

사전에 키 목록을 얻으려면 어떻게해야합니까?

답변:


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

6
"this"를 사용해야합니다.
JerryGoyal

15
@JerryGoyal 아니요, 필요하지 않습니다. yourDictionary함수에서 파생 된 개체의 일부 인지 또는 매개 변수 이름 인지에 대한 혼란을 없애기 위해 사용됩니다 .
bcdan

1
더 완전한 대답은 Key 유형을 문자열로 가정하지 않는 것입니다. var keyList = yourDictionary.Keys.ToList (); 또는 견과류 또는 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

5
@MartinCapodici 그렇다면 일반적으로 반복자가 중단되고 계속 거부 할 것입니다.
Marc Gravell

5
Marc, 그렇습니다.이 경우 다른 답변과 같은 것을하고 새 목록을 만드십시오.
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 네임 스페이스


13
잊지 마십시오 using System.Linq;. 무시할 답변을 알아야합니다. 죄송합니다 :)
Bitterblue 2016

2
@Bitterblue 감사합니다. 그 이유를 이해할 수 없었다 .ToList()내가 대답을 찾고 여기 와서 내가 없었에서 작업 한 파일 실현, 그래서 내가 그렇게 많은 시간을 사용했다 오류를 던지고 using System.Linq:)
드류

1
작동하지 않습니다 :Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
sakra

실제로 작동하지 않습니다. 수락 된 답변을 대신 사용하십시오.
aleck

1
@aleck 그것은 잘 작동합니다. 사용중인 Bitterblue 또는 .Net 프레임 워크 버전에서 제안한대로 System.Linq를 사용하지 않았을 수 있습니다. .Net framework 3.5에서 소개되었습니다 . 이 링크를 참조하십시오 . 이 방법을 사용하기 전에 System.Linq를 사용하도록 답변을 업데이트하고 있습니다.
prem

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

이 모든 복잡한 답변을 믿을 수 없습니다. 키가 문자열 유형이라고 가정합니다 (또는 게으른 개발자 인 경우 'var'을 사용하십시오).

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

작동하지 않는다는 것은 무엇을 의미합니까? Dictionary에는 KeyCollection 형식의 키 속성이 있으며이 메서드는 ToList <> () 확장 메서드가있는 ICollection을 구현합니다. 'using'문에 System.Linq를 추가하면 좋을 것입니다. using System.linq;
Antony Booth

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.