我有一个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();
}
答案 0 :(得分:0)
我不确定但这应该做你的功能所做的事情:
return mapADToRole.Where(item => item.Value.Any(groupsOfUser.Contains))
.OrderBy(item => item.Key)
.SelectMany(item => item.Value)
.FirstOrDefault();