2011-01-13 2 views
0

이것은 간단한 질문 일 수 있지만이 작업을 수행하는 간단한 방법을 알 수는 없습니다.C# - 사전의 값 사용

< 1 100> < 2 200> < 3 -999> < 4, 134> < 5 -999> < 6, 223 : I는 현재 다음과 같은 KeyValuePairs으로 간단한 사전을 > < 7, 123>

값 (-999)은 발생하는 오류의 표시기입니다. 내가 뭘하려고하는지 사전을 통해 반복하고 거기에 대한 -999 다음 키의 값을 사용합니다. 그 결과, 위의 예에서 주어진 것이다 :

< 1 100> < 2 200> < 3 134> < 4, 134> < 5 223> < 6 223> < 7 , 123>

어떤 생각이라도 대단히 감사하겠습니다!

+3

사전은 순서가 지정되지 않으므로 사전이 잘 진행되지 않을 수 있습니다. –

+0

사전이 정렬되지 않았습니까 ?? 그것은 몇 가지를 설명 할 수 있습니다 ... 나는 KeyValuePairs (독특한 키들과 함께)로 많은 일을하지만, 순서는 아주 중요합니다. 내가 사용할 수있는 비슷한 대상이 있습니까 ?? – keynesiancross

+1

@keynesiancross :'SortedDictionary'를보십시오. – jason

답변

4

키에 순서가 있다고 가정해야합니다 (그렇지 않으면 사전에 순서가 없기 때문에 필요합니다). SortedDictionary을 사용하는 것이 좋습니다.

어느 쪽이든, 당신은 말할 수 있습니다 : "마지막"항목이 -999 인 경우 수행 할 작업을 지정하지 않은

var keys = dictionary.Keys.OrderByDescending(k => k); 
int current = -999; 
foreach (var key in keys) { 
    if (dictionary[key] == -999) { 
     dictionary[key] = current; 
    } 
    current = dictionary[key]; 
} 

참고. 지금은 -999에 남아 있습니다.

1

n 번째 요소를 추가 할 때 n + 1 번째 요소에 액세스 할 수 있습니까? 그렇다면 n 번째 키를 추가 할 때 n + 1 번째 값으로 대체 할 수 있습니다.

그렇지 않으면 주문한 컬렉션이 필요합니다. SortedDictionary가 정렬 순서가 아닐 수도 있기 때문에 필요한 항목이 될지 모르겠습니다. 동일한 키를 가진 여러 개의 K, V 쌍을 나열하는 것도 당황 스럽습니다. 사전은 그것을 좋아하지 않을 것입니다.

V의 핵심은 무엇입니까? ID 속성처럼? 그렇다면 항목을 추가 한 순서를 유지하는 KeyedCollection에서 클래스를 파생 시키려고 시도 할 수 있으며, 키가 해당 속성 일 때 키의 속성을 결정할 수 있습니다. 그러나 다시, 중복 키가 없습니다.

+0

아, 그건 내 잘못이야. 위의 작업을 수행 할 때 약간의 복사 - 붙여 넣기 작업을 수행했습니다. – keynesiancross

0

나는 당신이 사전에 추가 된 순서대로 값을 처리하려고한다고 가정 할 것이고, 정렬에 일어날 수있는 순서가 아닐 것이라고 생각할 것이다. Stack <> . 이 방법으로 모든 KeyValuePair를 스택에 푸시 한 다음 거꾸로 튀어 나오게 할 수 있습니다. -999를 발견하면 스택에서 튀어 나와서 계속 이동 한 이전 KeyValuePair의 값을 적용 할 수 있습니다.

0

사전에 링크 된 목록을 사용할 필요가 없다면 마지막부터 시작하여 목록을 반복하여 -999 값을 업데이트 할 수 있습니다.

LinkedList<KeyValuePair<int, int>> myList = GetMyKeyValues(); 

LinkedListNode<KeyValuePair<int, int>> curr = myList.Last; 
LinkedListNode<KeyValuePair<int, int>> last = null; 

while (curr != null) 
{ 
    if (curr.Value == -999 && last != null) 
    { 
     curr.Value = last.Value; 
    } 

    last = curr; 
    curr = curr.Previous; 
}