c\#확장 방법 기묘 용 기초 편 5:Dictionary<br>넓히다
11716 단어 value
사전 에 키 와 값 추가
키 와 값 을 추가 하 는 데 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
《
c\#확장 방법
'시스템 글 은 2009 년 08 월 부터 쓰기 시 작 했 습 니 다.지금까지 모두 19 편 이 있 습 니 다.읽 기 를 환영 합 니 다.
기초 편:
중국어 처리 、 string 확장 、 byte 상용 확장 、 무 작위 확장 、 사전<TKey,Tvalue>확장
고급 편:
Scottgu 의"In"확장 개선 、 Aggregate 확장 개선 、 Enumerable.Cast<T>응용 、 확장 그룹 관리 、 ToString(문자열 형식)확장 、 WinForm 컨트롤 선택 기 、 트 리 、 종류 확장
변태 편:
Fibonacci 수열 에서"위탁 확장"및"배달 의뢰"를 끌 어 옵 니 다. 、 패키지 if/else,swith/case 및 while 、 switch/case 그룹 확장 、 string 의 혁명
성능 편:
확장 방법 성능 초기 측정
MVC 편:
확장 방법 우선 순 위 를 사용 하여 모든 페이지 TextBox For 텍스트 상 자 를 미화 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring 에서 application.properties 값을 객체에 저장하는 2가지 방법@Value 애노테이션을 활용하여 프로퍼티의 값을 받아올 수 있다. 프로퍼티의 값들을 스프링 빈의 필드로 매핑하여 사용할 수 있는 애노테이션이 @ConfigurationProperteis 이다. @EnableConf...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.