2010-05-10 9 views
4

저는 Dictionary<string,int>입니다. 사전에있는 값을 1 씩 줄이기 만하면됩니다.사전의 모든 int 값을 감소시킵니다.

나는 이것을 가지고 있지만 모범 사례인지 확실치 않습니다.

foreach (KeyValuePair<string, int> i in EPCs) 
{ 
    EPCs[i.Key] = i.Value - 1; 
} 

UPDATE : 값이 위치에 관련된 인덱스 번호가 becase 내가 값을 감소하려고 이유입니다. 사전에서 무언가를 삭제할 때 사전의 색인 번호를 줄여야합니다. 더 좋은 방법이있을 수 있습니다.

+2

이것은 이상한 일입니다. 당신이하고있는 일과 그 이유를 설명해 주시겠습니까? 아마도 사전보다 더 적절한 데이터 구조가있을 것입니다. 특히, 나는 이것이 매우 비싸다고 생각한다. 사전이 큰 경우 변경 사항이 많습니다. 이러한 작업을보다 효율적으로 지원하는 데이터 구조가 있습니다. –

답변

2

전적으로 이것이 적절하다고 생각합니다.

하지만 질문을 한 이래로 이런 종류의 코드에 대해 합리적이지 않을 것이라고 우려되는 점은 무엇입니까?

당신도, 당신은 당신이 찾고있는 무엇을 할 두 가지 옵션이 있음을 깨달아야한다 :

  1. 는 각 항목을 (코드는 않음)를 방문하여 기존 사전을 수정하거나
  2. 만들기 당신이 원하는 계산 된 값을 가진 새로운 사전.

당신은 LINQ 쉽게 두 번째 작업을 수행 할 수 있습니다

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
    { 
     foreach (T element in source) 
     { 
      action(element); 
     } 
    } 

:

var newDict = myDict.ToDictionary(kvp => kvp.Key, kvp => kvp.Value-1); 
+0

나는 그것이 몇 분 더 오래되고 더 높은 투표로 내 대답과 같은 정보를 포함하고있을 때 이것이 왜 받아 들여지는 대답인지 궁금하다. –

+0

코드를 실행했을 때 코드를 제거했을 때 콜렉션에 대한 예외가 생겼으므로 코드가 올바르지 않은 것으로 보입니다. – Jon

0

당신은 쓸 수 각각에 대한-조치를 취하고 모든 요소에 그것을 실행하는 자신을 열거 조금 다음과 같이 사용하십시오 :

EPCs.ForEach(x => EPCs[x.Key] = x.Value -1); 

정확한 것은 아닙니다. 당신이 전에 가지고 있었던 것보다 깨끗한 어떤 것 그러나 조금 더 조밀 한. Reactive Extensions에는 System.Interactive의 연산자가 Do 인 비슷한 연산자가 있습니다.

+1

'KeyValuePair'는 읽기 전용 유형입니다. 이 방법으로 내용을 수정할 수 없습니다. –

+0

그건 작동하지 않습니다. 'KeyValuePair'의'Value' 속성은 세터를 가지지 않습니다 - 당신은 이런 방식으로 사전에 할당 할 수 없습니다. – LBushkin

+0

예, 해결되었습니다. 나는 코드를 복사하여 붙이지 않았기 때문에 그것을 놓쳤다 ;-) –

5

기존 코드는 사전의 모든 값을 감소시키는 완전히 적절한 방법입니다. 새 사전을 만들고 싶었 경우

, 당신은 LINQ를 사용할 수 있습니다

EPCs = EPCs.ToDictionary(p => p.Key, p => p.Value - 1); 

이 뜻은, 그러나, 오히려 장소에서 기존의 인스턴스를 수정하는 것보다, 완전히 새로운Dictionary<string, int> 인스턴스를 만듭니다. 그러나 질문을 linq으로 태그를 지정 했으므로 LINQ가 문제를 해결할 수있는 한 가지 방법을 제공 할 것이라고 생각했습니다. 당신이 장기적으로 더 나은 선택이 될 수 있습니다 사전보다 다른 것을 사용하여 높은 성능을 필요로하는 경우

+0

LINQ 작업은 변경할 수없는 형식에서 작동하므로 새 사전을 만들지 않고 LINQ를 사용하여 수행 할 방법이 없다는 것이 맞습니다. –

+1

@BlueRaja : LINQ 작업이 기존의 enumerables *를 수정하지 못한다고 말하는 것이 더 정확하다고 생각합니다. LINQ에는 변경할 수있는 형식과는 다른 방식으로 변경할 수있는 것이 없습니다. –

0

코드는 완벽하게 정상적으로 상황 (Dictionary<string,int>).

이 부여됩니다.

2

이 직접 대답하지 않습니다, 하지만 각 항목에 대해 감소시키는 대신 오프셋을 저장하고 특수 클래스 또는 일반적으로 코드에서 항목을 가져올 때 즉시 축소 할 수 있습니다.

+0

그리고 런타임 복잡성상은 ... ;-)갑니다 – efi

관련 문제