2012-03-09 38 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

的問題是,類型推斷返回一個Dictionary<Guid, List<Guid>>,這是錯誤的類型,你要調用的方法明確規定的允許值在你的字典,例如。除此之外還有更多,但涉及類型差異討論。您可以解決與AsEnumerable擴展問題:

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

...或者你可以做一個簡單的演員,如下列:

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

如果你只是省略ToList()正如其他人推薦,類型推斷確實會呈現您期望的類型,但返回的IEnumerable將延遲執行,這對您而言可能有問題,也可能不是問題。將ToList留在那裏,但做一些類似的事情會立即評估項目,而不是在迭代時懶惰地評估它們。

有關延遲執行更詳細,請參閱「懶惰」(想偷懶評價)的Jon Skeet's Edulinq series, part 44

+0

是的,我遇到延遲執行的問題。評估結束後,我不會想到AsEnumerable。我想知道更多關於類型變化的問題,並且可能會提出另一個問題。儘管你的答案對我很好,謝謝! – 2012-03-12 12:51:08

1

行創建了一個字典,其中Guid類型的密鑰和List<Guid>類型的值。

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

所以只是刪除.ToList(),就是這樣,u.GroupUsers.Select()自己返回IEnumerable<Guid>

而且你可以在兩個值上進行迭代,因爲List也實現了IEnumerable,所以這足夠滿足foreach迭代器。

+0

的'.ToList()'有枚舉'u.GroupUsers'馬上的影響,這可能會或可能並不重要。例如,如果'u.GroupUsers'從數據庫中獲取結果將會很重要。 – hvd 2012-03-09 22:12:37

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>),這是您的字典無法支持的方法。

可以使用

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

部分我想所有u.GroupUsers有相同組ID。您可以獲得第一個組ID, 如果您可以訪問用戶類的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

他們爲什麼會有相同的GroupID?這個問題表明,用戶可以是多個組的成員。 – hvd 2012-03-10 08:46:56

+0

情景。我想。 GroupID上有一個關聯用戶到組。 – halit 2012-03-10 09:03:16

相關問題