programing

C# 목록을 사전으로 변환

muds 2023. 5. 6. 16:45
반응형

C# 목록을 사전으로 변환

이것은 하기에 이상하게 보일 수 있지만 그것을 무시하고, 그것을 변환하는 좋은 간결한 방법이 있습니까?List<string>로.Dictionary<string, string>여기서 사전의 각 키 값 쌍은 목록의 각 문자열입니다.

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

저는 많은 검색을 해봤고, 말 그대로 반대 방향으로 하는 스택 오버플로에만 수십 개의 예가 있습니다.

이 작업을 수행하는 이유는 3분의 2 부품을 가지고 있기 때문에 변경할 수 없습니다.하나는 이메일 주소 목록을 다음과 같이 반환합니다.List<string>수신인 매개 변수가 다음과 같은 전자 메일을 보냅니다.Dictionary<string, string>사전의 키는 이메일 주소이고 값은 실제 이름입니다.하지만 저는 실명은 모르지만 이메일 주소로 실명을 설정하면 여전히 작동합니다.따라서 목록을 다음으로 변환하려는 이유Dictionary<string, string>이것을 하는 방법은 많이 있습니다.aforeach사전에 kvp를 추가하는 목록의 루프.하지만 저는 테르스 코드를 좋아해서 단일 라인 솔루션이 있는지 궁금했습니다.

사용해 보십시오.

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>>따라서 각 문자열 인스턴스가 아래에 있는 고유한 키 목록이 표시됩니다.

편집

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

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

사용:

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

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

사용할 수 있는 항목:

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

언급URL : https://stackoverflow.com/questions/11581101/c-sharp-convert-liststring-to-dictionarystring-string

반응형