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

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

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

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

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



답변

이 시도:

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")) ...


답변

이것을 사용하십시오 :

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>>아래에 각 문자열 인스턴스가있는 고유 키 목록이 있습니다.


답변

사용하여 ToDictionary:

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

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


답변

당신이 사용할 수있는:

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


답변

편집하다

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

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
      }
    }


답변