C # List <string>을 Dictionary <string, string>으로 변환


117

이것은 이상한 일처럼 보일 수 있지만 그것을 무시하면 사전의 각 키 값 쌍이 목록의 각 문자열 인 List를 Dictionary로 변환하는 멋진 간결한 방법이 있습니까? 즉

List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3

나는 많은 검색을 해왔고 말 그대로 Stackoverflow에만 반대 방향으로 수행하는 수십 가지 예제가 있지만이 방법은 아닙니다.

이 작업을 수행하는 이유는 두 개의 세 번째 부분 구성 요소가 있고 변경하는 것이 내 손이 아니기 때문입니다. 하나는 이메일 주소 목록을 목록으로 반환하고 다른 하나는받는 사람 매개 변수가 사전 인 이메일을 보냅니다. 사전의 키는 이메일 주소이고 값은 실제 이름입니다. 하지만 실명은 모르지만 이메일 주소에 실명을 설정하면 작동합니다. 따라서 목록을 사전으로 변환하려는 이유. 이를 수행하는 방법에는 여러 가지가 있습니다. kvp를 사전에 추가하는 목록의 foreach 루프. 그러나 나는 간결한 코드를 좋아하고 한 줄 솔루션이 있는지 궁금했습니다.


1
나는 당신의 정당한 이유에 대해 더 나은 해결책을 가지고 있습니다.

2
Dictionary <,>를 사용하는 대신 HashSet <>이 요구 사항을 충족하는지 확인할 수 있습니다.
Greg

위의 댓글 작성자보다 더 직접적으로 : 이것을 원하는 이유를 설명하면 누군가가 더 나은 해결책을 제안 할 수 있습니다.
Tim S.

1
더 나은 해결책은 없습니다. 이메일 주소 인 문자열 목록을 반환하는 타사 구성 요소가 있습니다. 키가 이메일 주소이고 값이 수신자의 실제 이름 인 Dictionary <string, string>을 전달하는 이메일을 보내는 다른 타사 구성 요소가 있습니다. 그러나 실제 이름은 다시 이메일 주소 일 수도 있으므로 List <string>을 Dictionary <string, string>으로 변환하고 싶습니다.
Jonnster

답변:


243

이 시도:

var res = list.ToDictionary(x => x, x => x);

첫 번째 람다는 키를 선택하고 두 번째 람다는 값을 선택합니다.

당신은 그것을 가지고 놀 수 있으며 다음과 같이 키와 값을 다르게 만들 수 있습니다.

var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x));

목록에 중복 항목이 있으면 다음 Distinct()과 같이 추가 하십시오.

var res = list.Distinct().ToDictionary(x => x, x => x);

편집 유효한 이유에 대해 언급하기 위해 이와 같은 변환에 유효 할 수있는 유일한 이유는 어떤 시점에서 결과 사전의 키와 값이 분기 될 것이라는 것입니다. 예를 들어 초기 변환을 수행 한 다음 일부 값을 다른 값으로 바꿉니다. 키와 값이 항상 같으면 HashSet<String>상황에 훨씬 더 적합합니다.

var res = new HashSet<string>(list);
if (res.Contains("string1")) ...

목록 문자열 1, 문자열 2, string3, 문자열 1과 같은 경우이 오류가 발생합니다
Pranay라나

3
@PranayRana 네, 그렇습니다. 이것을 피하기 위해 .Distinct()뒤에 추가 할 수 있습니다 list.
dasblinkenlight 2012

감사. ToDictionary 기능을 놓쳤습니다. 기본적으로 같은 대답을 해주신 모든 분들께 감사드립니다. 나는 모두를 찬성했지만 하나의 답변 만 받아 들일 수 있습니다. 이것은 Distinct 코드가 추가 된 단 하나 였으므로 제 생각에는 가장 완벽했습니다.
Jonnster 2012

11

이것을 사용하십시오 :

var dict = list.ToDictionary(x => x);

MSDN 참조 을 .

Pranay가 주석에서 지적했듯이 항목이 목록에 여러 번 존재하면 실패합니다.
특정 요구 사항에 따라을 사용 var dict = list.Distinct().ToDictionary(x => x);하여 고유 한 항목의 사전을 가져 오거나 ToLookup대신 사용할 수 있습니다 .

var dict = list.ToLookup(x => x);

이것은 ILookup<string, string>본질적으로와 동일한을 반환하므로 그 IDictionary<string, IEnumerable<string>>아래에 각 문자열 인스턴스가있는 고유 키 목록이 있습니다.


목록 문자열 1, 문자열 2, string3, 문자열 1과 같은 경우이 오류가 발생합니다
Pranay라나

1

사용하여 ToDictionary:

var dictionary = list.ToDictionary(s => s);

문자열이 반복 될 수있는 Distinct경우 목록에서 먼저 호출 (중복 제거)을 수행하거나 키당 ToLookup여러 값을 허용하는 사용 을 사용하십시오.


0

당신이 사용할 수있는:

var dictionary = myList.ToDictionary(x => x);

0

편집하다

중복을 처리하는 또 다른 방법은 이렇게 할 수 있습니다.

var dic = slist.Select((element, index)=> new{element,index} )
            .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element);

또는


쉬운 방법은

var res = list.ToDictionary(str => str, str=> str); 

그러나 반복되는 문자열이 없는지 확인하십시오 ... 다시 말하면 위의 코드가 작동하지 않습니다.

반복되는 문자열이 있으면 이렇게하는 것이 더 좋습니다.

Dictionary<string,string> dic= new Dictionary<string,string> ();

    foreach(string s in Stringlist)
    {
       if(!dic.ContainsKey(s))
       {
        //  dic.Add( value to dictionary
      }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.