2011-03-29 5 views
4

I I 아래 샘플에 의해 묵시적 규칙을 사용하여, 다른 사전에 변환하고자하는 사전했습니다 :LINQ ToDictionary 항목 인덱스를 얻는 방법?

입력 :

Dictionary<string, string> inputs = new Dictionary<string, string>(3) 
{ 
    { "A", "First" }, 
    { "Z", "Third" }, 
    { "J", "Second" } 
}; 

출력 :

Dictionary<int, string> output = new Dictionary<string, string>(3) 
{ 
    { 0, "First" }, 
    { 1, "Second" }, 
    { 2, "Third" } 
}; 

내가 할 수 그것은 람다 문법 &을 사용하여 중간 객체가 없습니까?

감사합니다.

답변

6

사전의 열거 순서는 불확실합니다 (항목에 색인이 없음). 따라서 이것이 가능하지는 않습니다. 정수 값은 어떻게 유도됩니까?

편집 :

나는 지금 그것을 얻을 : 당신은 순서가되어야 하는지를 정의 할 수 있습니다 경우

inputs 
    .OrderBy(input => input.Key) 
    .Select((input, index) = >new {index, input.Value}) 
    .ToDictionary(x => x.index, x => x.Value) 
+0

색인은 키순으로 정렬 된 사전의 순위입니다. –

+0

ㅎ, 답변으로 답장 이상을 표시 할 수 없습니까? –

1

, 그때 내가 이런 식으로 할 것 (I 키에 의해 주문 선택) :

Dictionary<string, string> inputs = new Dictionary<string, string>(3) 
{ 
    { "A", "First" }, 
    { "Z", "Third" }, 
    { "J", "Second" } 
}; 

var outputs = inputs.OrderBy(i=>i.Key).Select(i=>i.Value).ToArray(); 

// output 
// String [] (3 items): 
First 
Second 
Third 

이렇게하면 요청한 색인 (예 : output[0])이있는 배열이 제공됩니다. 당신이 정말로 다시 사전 항목을 원하는 경우에

, 당신은 (그들이 정렬되지 않은이기 때문에 그냥 사전을 반환 할 수 없습니다)이처럼의는 IEnumerable을 얻을 수 있습니다 :

var outputs = inputs.OrderBy(i=>i.Key).Select(
    (entry, index) => new KeyValuePair<int, string>(index, entry.Value)); 

이 경우에 .ToArray()를 던져 너 필요해. 당신이 정말로 다시 사전을 원하는 경우

,이 시도 :

var outputs = inputs.OrderBy(i=>i.Key) 
        .Select((entry, i) => new { entry.Value, i }) 
        .ToDictionary(pair=>pair.i, pair=>pair.Value).Dump(); 

그냥 당신이 위에 열거하면, 당신은 다시 .OrderBy를 추가해야하므로 사전은 본질적으로 정렬되지 않는 점에 유의하십시오.

+0

var에 비해 사전 으로 결과를 얻을 수있는 기회가 있습니까? –

+0

예, 답을 업데이트했습니다. –

관련 문제