LINQ中另一个Collection的Group和Filter Collection

时间:2014-04-24 11:12:17

标签: c# linq grouping

我有这么多形式的数据:

public class Permission
{
    public string Url { get; set; }
    public string User { get; set; }
    public string PermissionLevel { get; set; }
}

第二个集合为List<string> SiteCollections。样本数据:

http://domain/project/1
http://domain/project/2
http://domain/project/3
http://domain/project/4
http://domain/project/5

现在,我的目标是按List<Permission> Permissions过滤此User。所以这给了我

var FilteredAndGrouped = data.Where(u => u.User == @"domain\username")

在此之后,我想通过其部分网址对此结果进行分组。每个权限网址都以列表SiteCollections中的一个网址开头。

如果已经开始

var filteredAndGrouped = data.Where(d => d.User == @"domain\User")
                             .GroupBy (d => SiteCollections.Any (sc => sc.StartsWith(d.Url)))

这导致使用键true / false进行分组,并且只有列表SiteCollections中令人兴奋的URL才会在键为true的分组中。 我想要的是一个分组,其中密钥是列表SiteCollections中的网址,而权限网址需要以分组的密钥开头。它不需要等于它。

最后我需要这种形式的结果:

Key: http://domain/project/1
    Permission 1 (Url: http://domain/project/1/xyz/xyz)
    Permission 3 (Url: http://domain/project/1/xyzz/xqeqyz)
    Permission 7 (Url: http://domain/project/1/xadadyz/xadadyz)
Key: http://domain/project/2
    Permission 2 (Url: http://domain/project/2/adyz/xdyz)
    Permission 4 (Url: http://domain/project/2/a2dyz/xdyz)
    Permission 21(Url: http://domain/project/2/a22dyz/xdyz)
Key: http://domain/project/3
    Permission 22 (Url: ...

1 个答案:

答案 0 :(得分:1)

var groupped = permissions
    .GroupBy(x => SiteCollections.FirstOrDefault(u => x.Url.StartsWith(u)))
    .Select(x => new { Key = x.Key, Permissions = x.ToArray() })
    .ToArray();

结果可能包含null键,这意味着SiteCollections中的网址不存在。