我想构建一个方法来确定给定的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; 无法从使用中推断出来。尝试指定类型参数 明确。
答案 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;