如何使用linq将列表与查找进行比较?

时间:2012-05-04 14:38:32

标签: .net linq list lookup

我有一个Lookup,它有一个优先级和组的主列表。此外,还有一个包含用户所在组的列表。ILookup<int, string>, List<string>。我想将List与ILookup进行比较,并返回与List中的组匹配的IGroupings。然后最终获得具有更高优先级的IGrouping(例如:返回6而不是3)。

我的问题在于List和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)));

更新

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();

        }

1 个答案:

答案 0 :(得分:0)

我不确定但这应该做你的功能所做的事情:

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