在this answer中,我编写了一个使用以下lista=lista[lista['Estado:'].isin('RJ' , 'SP' , 'PR' , 'RS')]
print (lista)
的LINQ扩展,因此我可以使用delegate
变量传递函数,例如out
:< / p>
int.TryParse
为了使用此扩展,我必须明确指定public delegate bool TryFunc<TSource, TResult>(TSource source, out TResult result);
public static IEnumerable<TResult> SelectTry<TSource, TResult>(
this IEnumerable<TSource> source, TryFunc<TSource, TResult> selector)
{
foreach (TSource item in source)
{
TResult result;
if (selector(item, out result))
{
yield return result;
}
}
}
类型,如:
<string, int>
我想删除"1,2,3,4,s,6".Split(',').SelectTry<string, int>(int.TryParse); // [1,2,3,4,6]
,类似于我们如何在不指定<string, int>
的情况下调用.Select(int.Parse)
,但是当我这样做时,我收到以下错误:
方法的类型参数&#39; LINQExtensions.SelectTry(IEnumerable,LINQExtensions.TryFunc)&#39;无法从使用中推断出来。尝试明确指定类型参数。
我的问题是,为什么不能推断这些类型?我的理解是编译器应该在编译时知道<int>
的签名,然后知道int.TryParse
TryFunc
的签名。
答案 0 :(得分:2)
无法推断,因为只有其中一个参数适合并且是字符串。第二个参数是out int
,并且不能在泛型参数中指定,这就是它无法推断出参数的原因。
在不指定参数的情况下调用SelectTry
的唯一方法是将您的委托声明指向int.TryParse
,然后将其作为参数传递。
我知道这不是你想要的,这是我知道绕过指定参数的唯一方法。
TryFunc<string, int> foo = int.TryParse;
var s = "1,2,3,4,s,6".Split(',').SelectTry(foo);
请记住,为了将方法作为委托传递,参数必须与1:1匹配。 int.TryParse
与TryFunc
匹配,但与SelectTry