2014-11-10 2 views
0

데이터를 동적으로 수집하고이 데이터를 저장할 데이터 구조로 Dictionary<int, string>을 선택했습니다. 나는 templatesKeyName이 요청에 대한 모든 INT의 쌍 (IDS) 및 이름와 관계있는을 포함 할사전의 키와 값을 얻는 방법

Dictionary<int, string> templatesKeyName = new Dictionary<int, string>(); 

방법의 말 : 내 방식의 시작 부분에서

나는 변수를 선언합니다.

private static Dictionary<int, string> GetTemplateForUserWithAccount() 
{ 
Dictionary<int, string> kv = new Dictionary<int, string>(); 
//populate the `kv` dictionary 
return kv; 
} 

와 내가 좋아하는 뭔가를 할 수 있도록하려면 : 그래서 예를 들어 내가 가진

if(Client.Accounts.Count > 0) 
{ 
    templatesKeyName.Add(GetTemplateForUserWithAccount()); 
} 

은 분명히 .Add() 확장은 두 개의 인수를 기대하지만 난 방법을 전달할 수 있습니다 밖으로 찾을 수 없습니다 그 결과 값을 임시 사전에 할당 한 다음 foreach으로 반복합니다. 또한 대부분의 경우 단일 결과를 얻을 것이므로 반복은 제가 실제로 고려해야 할 사항이 아니기 때문일 수 있습니다.

public static void AddRange<T,K>(this Dictionary<T,K> source, IEnumerable<KeyValuePair<T,K>> values) 
{ 
    foreach(var kvp in values) 
    { 
     if(!source.ContainsKey(kvp.Key)) 
      source.Add(kvp.Key, kvp.Value); 
    } 
} 

을 그리고 다음과 같이 사용 :

+0

반복 코드에서 또는 전화를하는 방법에 하나 일어날 수 있습니다. 'foreach (GetTemplateForUserWithAccount()의 var 항목) templatesKeyName.Add (item.Key, item.Value)'의 문제점은 무엇입니까? – adrianm

+0

@adrianm 뭔가 잘못되었지만'Selman22' 답변에서 볼 수 있듯이 - 비슷한 방법을 호출 할 때마다 반복 논리를 작성할 필요가 없기 때문에 여전히 논리를 한 곳에 유지하는 방법이 있습니다. 또한, 다른 콜렉션들은 기본적으로'AddRange'를 구현합니다. 그래서 나는 그 값들을 추가하는 더 좋은 방법이 있어야한다고 생각했습니다. – Leron

+1

나는 코드의 관리자에 대해 단순한 생각을하고있었습니다. 이제 갑자기 모든 사전에'.AddRange'가 추가 될 것입니다. 관리자는 실제로'.AddRangeIfNotExists'를 할 때'.AddRangeReplaceExisting'으로 작동 할 것으로 기대하는 다른 곳에서 그것을 사용하기 시작합니다. 좋은 메소드 네이밍 및 문서화로 당연히 해결할 수 있지만 문제가 될만한 가치가 있습니다. – adrianm

답변

1

당신은 그것을 위해 확장 메서드를 만들 수 있습니다

templatesKeyName.AddRange(GetTemplateForUserWithAccount()); 
+0

흥미 롭습니다. 나는이 메소드가 구현되어 있는지 알아보기 위해'Dictionary'를위한'AddRange'를 구현하지 않은 이유를 설명했습니다 .... 그러나 저에게 완벽합니다. 감사합니다. – Leron

+0

@Leron -'List' (여기서'AddRange'가 이미 구현되었습니다)를 사용하면 중복 된 항목을 가질 수 있습니다. 그러나'Dictionary'는 같은 키를 두 번 가져서는 안됩니다. 그렇다면 기본 동작은 무엇입니까? 기존 키의 값을 덮어 쓰시겠습니까? 키가 있으면 건너 뛰시겠습니까? 예외를 던지시겠습니까? 이 구현은 "키가 존재하면 건너 뛰기"를 선택합니다. 하지만 다른 곳에서는 덮어 쓰기가 더 낫습니다. 그리고 아직도 예외를 던지고있는 다른 곳은 적절할 것입니다. 개발자는 아마도 * 특정 표준 구현을 결정하기를 원하지 않았을 것입니다. 아시다시피, 자신 만의 것을 만드는 것은 쉽습니다. – Corak

관련 문제