C# LINQ를 사전으로 변환

C Linqleul Sajeon Eulo Byeonhwan



C# LINQ에서 사전 만들기 System.Collections.Generic.IEnumerable ToDictionary() 메서드를 사용하면 가능합니다. 이 메서드는 주어진 에서 를 사용하여 사전을 만듭니다. 그만큼 System.ArgumentNullException 데이터 소스, keySelector 또는 elementSelector가 null인 경우 발생합니다. 또한 keySelector가 두 요소에 대해 중복 키를 생성하는 경우 System.ArgumentException 던져진다. 이 가이드에서는 두 가지 메서드를 오버로드하여 목록 데이터 원본에서 사전을 만드는 방법에 대해 설명합니다.

통사론:

1. 주어진 데이터 소스에서 지정된 키 선택기 및 요소 선택기 기능에 따라 사전을 생성하려면 다음 메소드를 오버로드하십시오.









매개변수:



    1. 원천 : 소스는 이 소스에서 사전이 생성되는 IEnumerable(목록)일 수 있습니다.
    2. 키선택기 : 각 요소에서 키를 얻어오는 함수입니다.
    3. 요소 선택기: 요소를 가져오는 데 사용되는 함수입니다.
    4. T소스 : 데이터 소스의 종류를 지정하는 type 매개변수입니다.
    5. T키: 키의 유형을 지정하는 유형 매개변수입니다.
    6. TElement : 요소의 종류를 지정하는 type 매개변수입니다.

2. 주어진 데이터 소스에서 지정된 키 선택기 기능에 따라 사전을 생성하려면 다음 메소드를 오버로드하십시오.





매개변수:



    1. 원천 : 소스는 이 소스에서 사전이 생성되는 IEnumerable(목록)일 수 있습니다.
    2. 키선택기 : 각 요소에서 키를 얻어오는 함수입니다.
    3. 소스: 이것은 데이터 소스의 유형을 나타냅니다.
    4. 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이고 키가 중복된 경우 이 메서드에서 발생하는 두 가지 예외 사례를 배웠습니다.