2012-03-09 2 views
3

IDictionary<Guid, IEnumerable<Guid>> 변수를 메서드에 전달해야합니다. 나는 다음과 같은 오류가개체에 Linq 사용, 형식 요구 사항을 충족하지 못하는 ToDictionary 메서드

var userGroupDictionary = _selectedUsers.ToDictionary(u => u.UserGuid, u => u.GroupUsers.Select(gu => gu.Group.GroupGuid).ToList()); 

: 나는 다음과 같은 코드를 사용할 때 나는 내 컬렉션을 반복하는 경우

cannot convert from System.Collections.Generic.Dictionary<System.Guid,System.Collections.Generic.List<System.Guid>>' to 'System.Collections.Generic.IDictionary<System.Guid,System.Collections.Generic.IEnumerable<System.Guid>>' 

은 그러나 작동합니다

var userGroupDictionary = new Dictionary<Guid, IEnumerable<Guid>>(); 
foreach (var user in _selectedUsers.Where(user => !userGroupDictionary.ContainsKey(user.UserGuid))) 
{ 
    userGroupDictionary.Add(user.UserGuid, user.GroupUsers.Select(gu => gu.Group.GroupGuid).ToList()); 
} 

어떤 아이디어가 무슨 일이야? 컴파일러는 Dictionary<Guid, List<Guid>> 만족 IDictionary<Guid, IEnumerable<Guid>>

답변

1

문제이다 사용 예를 들어, 사전에 허용되는 값을 명시 할 수 있습니다. 그보다 조금 더 있지만, 유형 차이에 대한 논의가 있습니다. 당신은 AsEnumerable 확장의 문제 해결할 수 :

var userGroupDictionary = _selectedUsers 
    .ToDictionary(
     u => u.UserGuid, 
     u => u.GroupUsers.Select(gu => gu.Group.GroupGuid).ToList().AsEnumerable()); 

을 ... 또는 당신은 다음과 같이 간단한 캐스트를 수행 할 수 있습니다 당신은 단지 ToList()를 생략하면 다른 사람이 추천대로

var userGroupDictionary = _selectedUsers 
    .ToDictionary(
     u => u.UserGuid, 
     u => (IEnumerable<Guid>)u.GroupUsers.Select(gu => gu.Group.GroupGuid).ToList()); 

형식 유추는 실제로 예상되는 형식을 렌더링하지만 반환되는 IEnumerable은 지연 실행을 갖게되어 문제가 될 수도 있고 그렇지 않을 수도 있습니다. ToList을 거기에 남겨두고 있지만 일종의 캐스트를하면 반복 할 때 느리게 평가하는 대신 항목을 즉시 평가합니다. 지연된 실행에 대한 자세한 세부 사항에 대한

은 "게으름"(게으른 평가를 생각한다) Jon Skeet's Edulinq series, part 44

+0

예, 지연된 실행 문제가 있습니다. 평가 후 AsEnumerable에 대해 생각하지 않았을 것입니다. 나는 타입 차이 문제에 대해 더 알고 싶다. 그리고 또 다른 질문을 올릴 것이다. 당신의 대답은 나를 위해 위대한 작품, 감사합니다! –

1

라인 아래 사전을 만들어 말할 수없는 곳 형 Guid의 키 입력 List<Guid>의 값.

_selectedUsers.ToDictionary(
        u => u.UserGuid, 
        u => u.GroupUsers.Select(gu => gu.Group.GroupGuid).ToList() 
        ); 
그러니 그냥 제거 .ToList()하고 그것 뿐이다, u.GroupUsers.Select() 자체가 IEnumerable<Guid>를 반환합니다.

그리고 ListIEnumerable을 구현하기 때문에 두 값을 반복 할 수 있습니다.이 값은 foreach 반복자를 만족시킬만큼 충분합니다.

+0

은'.ToList()가'또는 문제가되지 않을 수도 있습니다 바로'u.GroupUsers'을 열거하는 효과가있다. 예를 들어'u.GroupUsers'가 데이터베이스에서 결과를 얻는 지 여부는 중요합니다. – hvd

0

Is the compiler unable to tell that Dictionary<Guid, List<Guid>> satisfies IDictionary<Guid, IEnumerable<Guid>>

아니, 컴파일러는 Dictionary<Guid, List<Guid>>IDictionary<Guid, IEnumerable<Guid>>을 만족하지 않음을 알 수있다. 예를 들어 후자는 사전이 지원할 수없는 방법 Add(Guid, IEnumerable<Guid>)을 제공합니다.

당신은 명시 적으로 형식 유추가 통화 할 방법에 대한 잘못된 유형 인 Dictionary<Guid, List<Guid>>을 반환

_selectedUsers.ToDictionary<User, Guid, IEnumerable<Guid>>(
    u => u.UserGuid, 
    u => u.GroupUsers.Select(gu => gu.Group.GroupGuid).ToList()) 
0

의 섹션을 참조하십시오 내가 u.GroupUsers 모두가 같은 그룹 ID를 가지고 생각합니다. 첫 번째 groupID 인 을 얻을 수 있습니다. 사용자 클래스에서 groupID 속성에 액세스 할 수 있습니다. GroupID를 사용해야합니다. Like _selectedUsers.ToDictionary(u=>u.UserGuid,u.GroupID); 사용자 클래스에서 GroupId에 액세스 할 수없는 경우. 사용 :

_selectedUsers.ToDictionary(
        u => u.UserGuid, 
        u => u.GroupUsers.Select(gu => gu.Group.GroupGuid).First()); 
+0

그룹 ID가 같은 이유는 무엇입니까? 이 질문은 사용자는 여러 그룹의 구성원이 될 수 있다고 제안합니다. – hvd

+0

시나리오. 나는 생각했다. GroupID에 User to Group이라는 그룹이 있습니다. – halit

관련 문제