2017-12-01 1 views
0

목록 사전이 있는데 사전에 각 목록의 첫 번째 요소 목록을 얻고 싶습니다. 기본적으로 :C# LINQ 사전의 첫 번째 목록 항목 가져 오기 <string, List <object>>

Dictionary<string, List<object>> dico = new Dictionary<string, List<Object>>(); 

    // fill data... 

    List<object> list = new List<Object>(); 
    foreach(var value in dico.Values) 
    { 
     list.Add(value.ElementAt(0)); 
    } 

LINQ로 수행 할 수 있습니까?

고마워요. 당신이 보호 할 수 있습니다, 당신은 빈 List의되었거나 누락 (null) 목록에 관심을하는 경우

var list = dico.Select(p => p.Value[0]).ToList(); 

:

+0

"LINQ로이 작업을 수행 할 수 있습니까?" 음, 네. 그리고 그것이 당신이 한 일입니다. 너 뭐 찾고있어? – gunr2171

+0

시도한 것을 보여줄 수 있습니까? – NetMage

+2

'List '을 가지고있을 때 왜'ElementAt'를 사용하겠습니까? 목록이 비어있는 경우 두 경우 모두 예외가 발생할지라도 'value [0]'을 수행하십시오. – juharr

답변

4

DictionaryIEnumerable<KeyValuePair> 그래서 당신이 다음, 당신이 원하는 각 값에서 프로젝트 목록으로 변환 할 수 있습니다 구현 투사 :

var list = dico.Select(p => p.Value?.FirstOrDefault()).ToList(); 

PS 내가 ElementAtOrDefault 생각은 List하는 방법이었다, 또는 적어도 특별한에 대한 맡았다,하지만 그렇지 않습니다. 나는 닷넷 정적 유형이 알려진 경우 대신 특별한 경우도의 List를 확인하기 위해 형식 변환을 사용하는 이유를 궁금해 :

public static T ElementAtOrDefault<T>(this List<T> src, int index) => src.Count > index ? src[index] : default(T); 

빠른 테스트는 확장 메서드는 20 배 빠른 List에 나타냅니다.

+1

'FirstOrDefault()'를 사용할 수 없습니까? – maccettura

+0

@maccettura 예. 나는'ElementAtOrDefault'가 특별한 케이스이거나'List'에 대한 메소드라고 생각했지만 대신에'List'를위한 특별한 케이스가 있습니다. – NetMage

+0

'.Net은 왜 정적 유형이 알려져 있는지에 대한 특별한 경우 대신에 .Net이 유형 변환을 사용하여 목록을 확인하는 이유를 궁금해합니다. '작성된 방식은'목록 '이 캐스트 된 경우에도 성능 이점을 얻는다는 것을 의미합니다 'IEnumerable' 어딘가에 있습니다. https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/guidelines-for-collections#collection-parameters ->'대신 IEnumerable 또는 IEnumerable을 사용하여 개체에서 ICollection을 구현하는지 여부를 동적으로 확인하십시오. 또는 ICollection. – mjwills

관련 문제