사전 값을 배열로 변환


81

사전의 값 목록을 배열로 바꾸는 가장 효율적인 방법은 무엇입니까?

나는이있는 경우 예를 들어, DictionaryKey이다 StringValue이다 Foo, 나는 싶어Foo[]

VS 2005, C # 2.0을 사용하고 있습니다.

답변:


125
// dict is Dictionary<string, Foo>

Foo[] foos = new Foo[dict.Count];
dict.Values.CopyTo(foos, 0);

// or in C# 3.0:
var foos = dict.Values.ToArray();

.ToArray <Foo> () 확장자가 더 나은 성능을 발휘합니까?
Goran

하지만 이것이 가장 효율적이라는 것을 어떻게 알 수 있습니까?
Tom Carter

2
@Tom 저는 일반적으로 프레임 워크에 내장 된 모든 것 (예 : .CopyTo () 또는 .ToArray ())이이를 수행하는 가장 효율적인 방법이라고 생각합니다. 마이크로 소프트는 나보다 똑똑합니다. :)
Matt Hamilton

5
ToArray는 CopyTo보다 성능이 떨어집니다 (CopyTo를 사용하여 내부 중간 표현으로 복사 한 다음 다시 복사하여 반환). 그러나 모든 마이크로 성능 관련 문제와 마찬가지로 가독성, 견고성 및 유지 관리가 문제가 될 경우 성능을 측정합니다.
ICR

16
당신은 추가해야하므로 ToArray ()는 LINQ의 확장 방법입니다using System.Linq;
기독교 Davén

12

목록에 저장하십시오. 더 쉽습니다.

List<Foo> arr = new List<Foo>(dict.Values);

물론 특별히 배열로 원한다면;

Foo[] arr = (new List<Foo>(dict.Values)).ToArray();

6

값에 ToArray () 함수가 있습니다.

Foo[] arr = new Foo[dict.Count];    
dict.Values.CopyTo(arr, 0);

그러나 나는 그것이 효율적이라고 생각하지 않습니다 (실제로 시도하지는 않았지만 모든 값을 배열에 복사한다고 생각합니다). 정말 어레이가 필요합니까? 그렇지 않은 경우 IEnumerable을 전달하려고합니다.

IEnumerable<Foo> foos = dict.Values;

4

linq를 사용하려면 다음을 시도해보세요.

Dictionary<string, object> dict = new Dictionary<string, object>();
var arr = dict.Select(z => z.Value).ToArray();

어느 것이 더 빠르거나 더 좋은지 모르겠습니다. 둘 다 나를 위해 일합니다.


2
dict.Values.ToArray()동일한 작업을 수행하지만 델리게이트를 통해 각 값을 구체화하는 오버 헤드가 없습니다.
BACON 2013

1

요즘에는 LINQ를 사용할 수있게되면 사전 키와 해당 값을 단일 문자열로 변환 할 수 있습니다.

다음 코드를 사용할 수 있습니다.

// convert the dictionary to an array of strings
string[] strArray = dict.Select(x => ("Key: " + x.Key + ", Value: " + x.Value)).ToArray();

// convert a string array to a single string
string result = String.Join(", ", strArray);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.