통사론:
1. 주어진 데이터 소스에서 지정된 키 선택기 및 요소 선택기 기능에 따라 사전을 생성하려면 다음 메소드를 오버로드하십시오.
매개변수:
-
- 원천 : 소스는 이 소스에서 사전이 생성되는 IEnumerable(목록)일 수 있습니다.
- 키선택기 : 각 요소에서 키를 얻어오는 함수입니다.
- 요소 선택기: 요소를 가져오는 데 사용되는 함수입니다.
- T소스 : 데이터 소스의 종류를 지정하는 type 매개변수입니다.
- T키: 키의 유형을 지정하는 유형 매개변수입니다.
- TElement : 요소의 종류를 지정하는 type 매개변수입니다.
2. 주어진 데이터 소스에서 지정된 키 선택기 기능에 따라 사전을 생성하려면 다음 메소드를 오버로드하십시오.
매개변수:
-
- 원천 : 소스는 이 소스에서 사전이 생성되는 IEnumerable(목록)일 수 있습니다.
- 키선택기 : 각 요소에서 키를 얻어오는 함수입니다.
- 소스: 이것은 데이터 소스의 유형을 나타냅니다.
- T키 : 키의 종류를 지정합니다.
예 1: 지정된 키 선택기 및 요소 선택기 기능
5개의 레코드가 있는 4개의 속성(Acc_ID, Acc_Name, Industry, Revenue)을 포함하는 '계정' 유형으로 목록을 만듭니다.
1. 키가 Acc_ID이고 값이 Acc_Name인 이전 목록에서 사전을 생성합니다.
2. 키가 Acc_Name이고 값이 Revenue인 이전 목록에서 사전을 생성합니다.
사용 시스템.링크 ;
사용 System.Collections.Generic ;
수업 계정 정보
{
공공의 공전 무효의 기본 ( )
{
// 유형 목록 만들기 - 계정.
목록 세부 정보 = 새로운 목록 ( ) ;
// 목록에 5개의 레코드를 추가합니다.
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 1 , Acc_Name = '리눅스' , 산업 = '교육' ,수익 = 2500 } ) ;
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 2 , Acc_Name = '파이썬' , 산업 = '부트캠프' ,수익 = 10000 } ) ;
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 삼 , Acc_Name = '자바' , 산업 = '교육' ,수익 = 500 } ) ;
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 4 , Acc_Name = '.그물' , 산업 = '훈련' ,수익 = 2080년 } ) ;
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 5 , Acc_Name = '신탁' , 산업 = '직업' ,수익 = 2090년 } ) ;
// Key를 Acc_ID로, Value를 Acc_Name으로 사용하여 위 목록에서 사전을 생성합니다.
콘솔 . WriteLine ( ' ---- Acc_ID로 키 및 Acc_Name으로 값----' ) ;
사전 accounts_dict1 = 세부 . ToDictionary ( 제이 => 제이 . Acc_ID , 제이 => 제이 . Acc_Name ) ;
각각 ( KeyValuePair i ~에 account_dict1 )
{
콘솔 . WriteLine ( '계정 ID :' + 나 . 열쇠 + ' 계정 이름 :' + 나 . 값 ) ;
}
// Key를 Acc_Name으로, Value를 Revenue로 사용하여 위 목록에서 사전을 생성합니다.
콘솔 . WriteLine ( ' ---- Acc_Name으로 키 및 수익으로 값----' ) ;
사전 accounts_dict2 = 세부 . ToDictionary ( 엘 => 엘 . Acc_Name , 내가 => 엘 . 수익 ) ;
각각 ( KeyValuePair k ~에 account_dict2 )
{
콘솔 . WriteLine ( '계정 이름:' + 케이 . 열쇠 + ' 계정 수익 :' + 케이 . 값 ) ;
}
}
}
// 명명된 클래스 만들기 - 네 가지 속성이 있는 계정
공공의 수업 계정
{
공공의 정수 Acc_ID { 얻다 ; 세트 ; }
공공의 끈 Acc_Name { 얻다 ; 세트 ; }
공공의 끈 산업 { 얻다 ; 세트 ; }
공공의 정수 수익 { 얻다 ; 세트 ; }
}
산출:
설명:
1. 네 가지 특성을 가진 '계정'이라는 클래스를 만듭니다.
2. 메인 클래스에서 “계정” 유형의 목록을 만들고 여기에 5개의 레코드를 삽입합니다.
3. 키가 Acc_ID이고 값이 Acc_Name인 이전 목록에서 사전을 만듭니다. 여기서는 TKey를 int로 지정하고 TElement를 문자열로 지정합니다. ToDictionary() 메서드 내에서 keySelector의 Acc_ID와 elementSelector의 Acc_Name을 전달합니다. 마지막으로 'foreach' 루프를 사용하여 사전을 반복하고 키 및 값 속성을 사용하여 키와 값을 반환합니다.
4. 키가 Acc_Name이고 값이 Revenue인 이전 목록에서 사전을 만듭니다. 여기서는 TKey를 문자열로 지정하고 TElement를 int로 지정합니다. ToDictionary() 메서드 내에서 keySelector의 Acc_Name과 elementSelector의 Revenue를 전달합니다. 마지막으로 'foreach' 루프를 사용하여 사전을 반복하고 키 및 값 속성을 사용하여 키와 값을 반환합니다.
예제 2: 지정된 키 선택기
이전 코드를 사용하고 키를 Acc_ID로 사용하여 이전 목록에서 사전을 만듭니다.
사용 체계 ;사용 시스템.링크 ;
사용 System.Collections.Generic ;
수업 계정 정보
{
공공의 공전 무효의 기본 ( )
{
// 유형 목록 만들기 - 계정.
목록 세부 정보 = 새로운 목록 ( ) ;
// 목록에 5개의 레코드를 추가합니다.
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 1 , Acc_Name = '리눅스' , 산업 = '교육' ,수익 = 2500 } ) ;
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 2 , Acc_Name = '파이썬' , 산업 = '부트캠프' ,수익 = 10000 } ) ;
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 삼 , Acc_Name = '자바' , 산업 = '교육' ,수익 = 500 } ) ;
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 4 , Acc_Name = '.그물' , 산업 = '훈련' ,수익 = 2080년 } ) ;
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 5 , Acc_Name = '신탁' , 산업 = '직업' ,수익 = 2090년 } ) ;
// 위 목록에서 Key를 Acc_ID로 사용하여 사전을 만듭니다.
사전 account_dict = 세부 . ToDictionary ( 제이 => 제이 . Acc_ID ) ;
각각 ( KeyValuePair i ~에 account_dict )
{
콘솔 . WriteLine ( '열쇠:' + 나 . 열쇠 + '--> 계정 이름:' + 나 . 값 . Acc_Name
+ ' 회계 산업 :' + 나 . 값 . 산업
+ ' 계정 수익 :' + 나 . 값 . 수익 ) ;
}
}
}
// 명명된 클래스 만들기 - 네 가지 속성이 있는 계정
공공의 수업 계정
{
공공의 정수 Acc_ID { 얻다 ; 세트 ; }
공공의 끈 Acc_Name { 얻다 ; 세트 ; }
공공의 끈 산업 { 얻다 ; 세트 ; }
공공의 정수 수익 { 얻다 ; 세트 ; }
}
산출:
설명:
여기에서는 키를 Acc_ID로 사용하여 사전을 만듭니다. 이것은 목록에서 생성한 사전의 각 레코드에 대한 키 역할을 합니다. 그런 다음 'foreach' 루프를 사용하여 키 및 값 속성을 사용하여 키와 값(속성 포함)을 가져옵니다.
예제 3: 중복 키 – ArgumentException
두 개의 레코드가 있는 목록을 만들고 Acc_ID를 키로 사용하여 사전으로 변환해 봅니다.
사용 체계 ;사용 시스템.링크 ;
사용 System.Collections.Generic ;
수업 계정 정보
{
공공의 공전 무효의 기본 ( )
{
// 유형 목록 만들기 - 계정.
목록 세부 정보 = 새로운 목록 ( ) ;
// 목록에 2개의 레코드를 추가합니다.
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 1 , Acc_Name = '리눅스' , 산업 = '교육' ,수익 = 2500 } ) ;
세부 . 추가하다 ( 새로운 계정 { Acc_ID = 1 , Acc_Name = '파이썬' , 산업 = '부트캠프' ,수익 = 10000 } ) ;
// 위 목록에서 Key를 Acc_ID로 사용하여 사전을 생성하려고 합니다.
사전 account_dict = 세부 . ToDictionary ( 제이 => 제이 . Acc_ID ) ;
}
}
// 명명된 클래스 만들기 - 네 가지 속성이 있는 계정
공공의 수업 계정
{
공공의 정수 Acc_ID { 얻다 ; 세트 ; }
공공의 끈 Acc_Name { 얻다 ; 세트 ; }
공공의 끈 산업 { 얻다 ; 세트 ; }
공공의 정수 수익 { 얻다 ; 세트 ; }
}
예외:
System.ArgumentException인 처리되지 않은 예외는 두 Acc_ID에서 키가 중복(1)되기 때문에 발생합니다.
예제 4: Null 소스 – ArgumentNullException
'계정' 유형으로 목록을 만들고 여기에 null을 할당합니다. 키를 Acc_ID로 사용하여 이전 목록에서 사전을 생성해 보십시오.
사용 체계 ;사용 시스템.링크 ;
사용 System.Collections.Generic ;
수업 계정 정보
{
공공의 공전 무효의 기본 ( )
{
// 계정 유형의 목록을 만들고 여기에 null을 할당합니다.
목록 세부 정보 = 없는 ;
// Acc_ID로 키를 사용하여 위의 목록에서 사전을 생성하려고 합니다.
사전 account_dict = 세부 . ToDictionary ( 제이 => 제이 . Acc_ID ) ;
}
}
// 명명된 클래스 만들기 - 네 가지 속성이 있는 계정
공공의 수업 계정
{
공공의 정수 Acc_ID { 얻다 ; 세트 ; }
공공의 끈 Acc_Name { 얻다 ; 세트 ; }
공공의 끈 산업 { 얻다 ; 세트 ; }
공공의 정수 수익 { 얻다 ; 세트 ; }
}
예외:
목록이 null이므로 System.ArgumentNullException인 처리되지 않은 예외가 발생합니다.
결론
C# LINQ의 ToDictionary() 메서드를 사용하여 IEnumerable(여기서는 목록)에서 사전을 만드는 방법을 배웠습니다. 이 메서드는 두 가지 방법으로 오버로드할 수 있습니다. 예제를 통해 두 가지 방법에 대해 논의했습니다. 또한 데이터 소스/keySelector/elementSelector가 null이고 키가 중복된 경우 이 메서드에서 발생하는 두 가지 예외 사례를 배웠습니다.