使用Linq确定Uris列表是否是另一个Uri的基础

时间:2014-09-22 19:27:38

标签: linq

我想构建一个方法来确定给定的URL是否是List中许多URL之一的子级。我想用Linq接近这个,但语法似乎超出了我的理解。这是我尝试过的,我希望isChild == true。

List<Uri> ProductionUriList = new List<Uri>(){
    new Uri(@"https://my.contoso.com/sites/Engineering",UriKind.Absolute),
    new Uri(@"https://my.contoso.com/sites/APAC",UriKind.Absolute),
    new Uri(@"https://my.contoso.com/sites/China",UriKind.Absolute),
    new Uri(@"https://my.contoso.com/sites/EMEA",UriKind.Absolute),
    new Uri(@"https://my.contoso.com/sites/India",UriKind.Absolute),
    new Uri(@"https://my.contoso.com/sites/Mexico",UriKind.Absolute),
    new Uri(@"https://my.contoso.com/sites/SamCam",UriKind.Absolute),
    new Uri(@"https://my.contoso.com/sites/USA",UriKind.Absolute),
};


var isChild = 
        ProductionUriList.SelectMany (p => p.IsBaseOf(new Uri("https://my.contoso.com/sites/China/Site1",UriKind.Absolute)));

运行时错误说:

  

方法的类型参数   &#39; System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable,   System.Func&GT;)&#39;   无法从使用中推断出来。尝试指定类型参数   明确。

2 个答案:

答案 0 :(得分:0)

确定uri是否是一个或多个孩子:

var isChild = ProductionUriList.Any(p => p.IsBaseOf(newUri("https://my.contoso.com/sites/China/Site1",UriKind.Absolute)));

确定uri是否只是一个孩子:

var isChild = ProductionUriList.Count(p => p.IsBaseOf(newUri("https://my.contoso.com/sites/China/Site1",UriKind.Absolute))) == 1;

答案 1 :(得分:0)

如果你只是想检查一个集合上的bool条件,你可以使用any运算符:

    var isChild = ProductionUriList.Any(p => p.IsBaseOf(new Uri("https://my.contoso.com/sites/China/Site1", UriKind.Absolute)));

关于你的错误:selectmany运算符需要一个返回IEnumerable但你不提供的委托。你混淆了select和selectmany。如果选择select作为linq运算符,则可以进行计数&gt; 0的结果将产生与使用any运算符相同的结果:

var isChild = ProductionUriList.Select(p => p.IsBaseOf(new Uri("https://my.contoso.com/sites/China/Site1", UriKind.Absolute)).Count > 0;