2017-01-22 4 views
2

나는 목록에서 사전을 만들려는 널 (null), 그래서 나는이 방법을 사용합니다 :사전 키

Dictionary<long, List<MyType>> miDicIdMyType = myList.GroupBy(x => x.ForeignKey) 
               .ToDictionary(x => x.Key, x => x.ToList()); 

문제는 때로는 속성이 null 일 수있다, 그래서 사전 인해를 만들 수 있다는 것입니다 사전은 널값을 키로 허용하지 않습니다.

하지만이 특정 경우에는이 속성이 null인지 확인해야하며 null 인 경우 오류이므로 예외가 발생합니다. 이 특정 메서드에서는 목록의 모든 항목이이 속성에 null이 없기를 기대합니다.

그래서 나는이 작업을 수행 할 수있는 것 :

Dictionary<long, List<MyType>> miDicIdMyType = myList.GroupBy(x => (long)x.ForeignKey) 
             .ToDictionary(x => x.Key, x => x.ToList()); 

그것은 긴에 캐스팅이지만 null의 경우, 나는 오류가 발생합니다. 그래서 기본적으로 내가이 일을 원 :

Dictionary<long, MyType> myDic = new Dictionary<long, myType>(); 
foreach (Mytype iterator in miList) 
{ 
    if (iterator.ForeignKey == null) 
    { 
     throw new ArgumentNullException("Some items in the collection has null value and it is not expected."); 
    } 

    if (myDic.ContainsKey(iterator.ForeignKey) == false) 
    { 
     myDic.Add(iterator.ForeignKey, new List<MyType>()); 
    } 

    myDic[iterator.ForeignKey].Add(iterator); 
} 

나는 이것이 좋은 코드 또는 내가 LINQ 또는 람다 식 또는 다른 방법으로, 더 나은 방법으로 그것을 할 수 있는지 알고 싶습니다. 내 코드를 단순화해라.

+0

가 'X => x.ForeignKey' 줄로 람다 expession에''Func을 을 리팩토링 및 경우에 예외를 발생시킬 수는'* T.ForeignKey'는 NULL이다. – user3185569

+0

또 다른 옵션은'Dictionary >'입니다. –

답변

3

당신은 그런 것을 찾고 있습니까?

Dictionary<long, List<MyType>> miDicIdMyType = myList.GroupBy(x => 
{ 
    if (x.ForeignKey == null) 
     throw new Exception(); 
    return x.ForeignKey.Value; 
}) 
.ToDictionary(x => x.Key, x => x.ToList()); 
+0

고마워, 그래, 나는 그런 식으로 생각했다. 내가 이런 종류의 문법에 대해 많이 모른다면. –

2

먼저 조회가 생성됩니다. 이 작업을 수행하십시오.

var lookup = data.ToLookup(x => x.ForeignKey); 

키를 추가로 확인해야하는 경우 명명 된 메서드는 재사용과 가독성에 대해 궁금해합니다.

T IsNotNull<T>(T? obj, [CallerMemberName] string name = default(string)) where T : struct 
{ 
    if (obj == null) 
     throw new ArgumentNullException(name); 
    return obj.Value; 
} 

var lookup = data.ToLookup(x => IsNotNull(x.ForeignKey)); 

그러나 나는 이것을 전혀 사용하지 않도록주의 할 것입니다. 귀하의 linq 쿼리에 의존해서는 안/부작용, 특히 게으른 평가와 함께,해서는 안됩니다. 예외적 인 경우를 제기하는 이유를 찾는 것이 아니라 모든 비용으로 예외적 인 경우를 예방해야합니다. 이 특별한 경우 코드의이 시점에서는 예외가 부적절합니다. 걸러 낼 간단한 데이터 문제입니다.

처음부터 필터링하지 않는 이유는 무엇입니까?

var lookup = data.Where(x => x.ForeignKey != null).ToLookup(x => x.ForeignKey.Value); 
+0

처음에는 필터처럼 생각했습니다.하지만 필자는이 컬렉션이 반복적으로 두 번 컬렉션되어야한다고 생각합니다. 하나는 필터 용이고 다른 하나는 사전/조회를 만드는 것입니다. 어쨌든,이 사건을 필터링하고 계속하지 않는 것이 중요하다고 생각하기 때문에 예외를 던지고 싶습니다. –

+1

일반적으로 LINQ를 사용할 때 원본 원본 컬렉션은 전체 쿼리에서 _once_을 통해 반복됩니다. 값은 각 필터에서 통과됩니다. –

+0

어디에서 더 자세한 정보를 얻을 수 있습니까? 아니면 어떻게 테스트 할 수 있습니까? 감사. –