2012-05-04 82 views
1

我有一個具有優先級和組的主列表的查找。此外,列表中包含用戶所在的組。ILookup<int, string>, List<string>。我想將列表與ILookup進行比較,並返回與列表中的組匹配的IGroupings。然後最後得到具有更高優先級的IGrouping(例如:返回6而不是3)。如何使用linq將列表與查找進行比較?

我的問題是與列表和ILookup的實際比較。看來我可能不得不使用for循環。但我認爲我還沒有找到正確的Linq聲明。

我在下面試過。

 List<string> groupsOfUser = whatGroupsUserBelongTo(); 
     ILookup<int, string> loginGroups = mapADToRole.SelectMany(ad => ad.Value 
                      .Select(grp => new {ad.Key, Value = grp})) 
                 .ToLookup(adLkUp => adLkUp.Key, adLkUp => adLkUp.Value); 


     var blah = loginGroups.Where(adGrp => adGrp.SelectMany(ad => groupsOfUser.Contains(ad))); 

UPDATE:

mapADToRole是Dictionary<int, List<string>>。下面的代碼工作,但使用foreach循環。

 public static string getWindowsGroup() 
     { 
      List<string> groupsOfUser = whatGroupsUserBelongTo(); 
      ILookup<int, string> loginGroups = mapADToRole.SelectMany(ad => ad.Value 
                       .Select(grp => new {ad.Key, Value = grp})) 
                  .ToLookup(adLkUp => adLkUp.Key, adLkUp => adLkUp.Value); 



      List<IGrouping<int, string>> foo = new List<IGrouping<int, string>>(); 
      foreach (IGrouping<int, string> loginGroup in loginGroups) 
      { 
       foreach (var blah in loginGroup) 
       { 
        if (groupsOfUser.Contains(blah)) 
        { 
         foo.Add(loginGroup); 
        } 
       } 
      } 

      var foobar = foo.Max(grp => grp.Key); 
      return loginGroups[foobar].FirstOrDefault(); 

     } 
+0

這將是有益的,看看類/接口的定義。 –

+0

你在想相交法嗎? http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx我不知道我是否正確理解。 –

+0

@UfukHacıoğulları:請看。 – dotnetN00b

回答

0

我不知道,但這個應該做你的功能是什麼:

return mapADToRole.Where(item => item.Value.Any(groupsOfUser.Contains)) 
        .OrderBy(item => item.Key) 
        .SelectMany(item => item.Value) 
        .FirstOrDefault();