c\#확장 방법 기묘 용 기초 편 5:Dictionary<br>넓히다

11716 단어 value
Dictionary<TKey, TValue> 류 는 자주 사용 하 는 기초 류 이지 만 사용 하기에 확실히 편리 하지 않다.본 고 는 하나하나 토론 하고 확장 방법 으로 해결한다.
사전 에 키 와 값 추가
키 와 값 을 추가 하 는 데 Add 방법 을 사용 하지만 쉽게 추가 할 수 없 는 경우 가 많 습 니 다.Dictionary<TKey, TValue> 은 중복 이 허용 되 지 않 기 때문에 중복 키 를 추가 하려 고 할 때 Add 방법 으로 ArgumentException 을 유발 합 니 다.
대부분 우 리 는 다음 과 같은 모습 으로 쓴다.
var dict = new Dictionary<int, string>();

// ...

//    :      

if (dict.ContainsKey(2) == false) dict.Add(2, "Banana");

//    :     ,     

if (dict.ContainsKey(3) == false) dict.Add(3, "Orange");

else dict[3] = "Orange";

사실은 두 번 째 상황 은 다음 과 같이 쓸 수 있다(http://msdn.microsoft.com/zh-cn/library/9tee9ht2.aspx 참조).
dict[3] = "Orange";

그러나 많은 친구 들 이 이런 방식 에 대해 의심 을 표시 하 는데,이렇게 하면 문제 가 발생 할 지 확실 하지 않다.
 
위의 어떤 글씨 든 사전 을 사용 할 때 가장 큰 느낌 은 이상 이 생 길 까 봐 코드 가 수 다스 럽 게 쓰 인 다 는 것 이다.
나 는 사전 을 사용 할 때마다 이렇게 시간 이 길 어 졌 다.정말 지 겨 웠 다.차라리 확장 하고 다음 과 같은 두 가지 방법 으로 위의 두 가지 상황 에 대응 하 자.
/// <summary>

///             :     ,   ;  ,        

/// </summary>

public static Dictionary<TKey, TValue> TryAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, TValue value)

{

    if (dict.ContainsKey(key) == false) dict.Add(key, value);

    return dict;

}

/// <summary>

///              :     ,   ;  ,   

/// </summary>

public static Dictionary<TKey, TValue> AddOrReplace<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, TValue value)

{

    dict[key] = value;

    return dict;

}

TryAdd 와 AddOrReplace 두 가지 방법 은 비교적 강 한 자기 묘사 능력 을 가지 고 있어 사용 하기에 매우 편리 하고 간단 하 다.
dict.TryAdd(2, "Banana");

dict.AddOrReplace(3, "Orange");

Linq 나 jQuery 처럼 연결 해서 쓰 거나:
dict.TryAdd(1, "A")

    .TryAdd(2, "B")

    .AddOrReplace(3, "C")

    .AddOrReplace(4, "D")

    .TryAdd(5, "E");

또 다른 문 제 를 살 펴 보 자.
획득 값
사전 에서 가 져 오 는 값 은 보통 다음 과 같은 방식 을 사용 합 니 다.
string v = "defaultValue";

//    

if (dict.ContainsKey(3)) v = dict[3];

//    

bool isSuccess = dict.TryGetValue(3, out v);

색인 을 사용 하여 가 져 오기 전에 반드시 먼저 판단 해 야 합 니 다.그렇지 않 으 면 존재 하지 않 을 때 KeyNotFoundException 이상 이 발생 할 수 있 습 니 다.
나 는 특히 두 번 째 방식 을 싫어한다.왜냐하면 out 을 사용 하면 변 수 를 미리 설명 해 야 하기 때문에 코드 는 적어도 두 줄 이 어야 하고 간결 하지 못 하기 때문이다.
GetValue 확장 보기:
/// <summary>

///             ,             

/// </summary>

public static TValue GetValue<TKey, TValue>(this Dictionary<TKey, TValue> dict, TKey key, TValue defaultValue = default(TValue))

{

    return dict.ContainsKey(key) ? dict[key] : defaultValue;

}

사용 편의 성:
var v1 = dict.GetValue(2);         //       null

var v2 = dict.GetValue(2, "abc");  //      ”abc“

코드 한 줄 로 해결 할 수 있 습 니 다.
대량 추가
List<T> 류 는 AddRange 방법 이 있 습 니 다.foreach 순환 없 이 현재 집합 에 다른 집합 을 추가 할 수 있 습 니 다.
List<string> roles = new List<string>();

roles.AddRange(new[] { "role2", "role2" });

roles.AddRange(user.GetRoles());

상당히 편리 합 니 다.불쌍 한 Dictionary<TKey, TValue> 종 류 는 없습니다.다행히 확장 방법 이 있 습 니 다.
/// <summary>

///            

/// </summary>

/// <param name="replaceExisted">     ,    </param>

public static Dictionary<TKey, TValue> AddRange<TKey, TValue>(this Dictionary<TKey, TValue> dict, IEnumerable<KeyValuePair<TKey, TValue>> values, bool replaceExisted)

{

    foreach (var item in values)

    {

        if (dict.ContainsKey(item.Key) == false || replaceExisted)

            dict[item.Key] = item.Value;

    }

    return dict;

}

사용 예시:
var dict1 = new Dictionary<int, int>()

    .AddOrReplace(2, 2)

    .AddOrReplace(3, 3);

var dict2 = new Dictionary<int, int>()

    .AddOrReplace(1, 1)

    .AddOrReplace(2, 1)

    .AddRange(dict1, false);

 
스 레 드 보안:
간단 한 설명 을 하기 위해 본 논문 의 코드 는 스 레 드 안전 문 제 를 고려 하지 않 고 실제 프로젝트 에서 직접 사용 하 는 것 이 좋 지 않 습 니 다!
스 레 드 보안 은 ConcurrentDictionary클래스(.Net 4 추가)를 사용 하 십시오.다음 글 을 참고 하 십시오.
  • ConcurrentDictionary:.NET 4.0 의 새로운 스 레 드 안전 한 해시 표
  • ConcurrentDictionary<TKey,Tvalue>클래스


  • c\#확장 방법
    '시스템 글 은 2009 년 08 월 부터 쓰기 시 작 했 습 니 다.지금까지 모두 19 편 이 있 습 니 다.읽 기 를 환영 합 니 다.
    기초 편:
    중국어 처리string 확장byte 상용 확장무 작위 확장사전<TKey,Tvalue>확장
    고급 편:
    Scottgu 의"In"확장 개선Aggregate 확장 개선Enumerable.Cast<T>응용확장 그룹 관리ToString(문자열 형식)확장WinForm 컨트롤 선택 기트 리종류 확장
    변태 편:
    Fibonacci 수열 에서"위탁 확장"및"배달 의뢰"를 끌 어 옵 니 다.패키지 if/else,swith/case 및 whileswitch/case 그룹 확장string 의 혁명
    성능 편:
    확장 방법 성능 초기 측정
    MVC 편:
    확장 방법 우선 순 위 를 사용 하여 모든 페이지 TextBox For 텍스트 상 자 를 미화 합 니 다.

    좋은 웹페이지 즐겨찾기