在参数中传递 Anon 函数以供 Select 使用

本文关键字:Select 使用 函数 Anon 参数 | 更新日期: 2023-09-27 18:35:27

如何在 select 语句中传递要在参数中运行的 anon 函数?

    public IEnumerable<string> Tokenize(Func<string> tokenFunc = null)
    {
        IEnumerable<string> tokens = Regex.Split(INPUT, @"('d+|&|'||'(|'))").Where(x => string.IsNullOrEmpty(x) == false);
        if (tokenFunc != null)
        {
            tokens = tokens.Select(tokenFunc);
        }
    } 

我收到错误:

方法"Enumerable.Select(IEnumerable, Func)"的类型参数无法从用法中推断出来。尝试显式指定类型参数

我做错了什么?

我想这样称呼它:

MyViewObj.Tokenize( (x) => { if(x=='1') return 1; else return 0; });

在参数中传递 Anon 函数以供 Select 使用

问题出在您的tokenFunc它应该是 Func<TSource, TResult> 类型并且您正在提供 Func<TResult> .

天真地,看看你怎么称呼它,它应该变成:

public IEnumerable<string> Tokenize(Func<string, int> tokenFunc = null)
{
    IEnumerable<string> tokens = Regex.Split(INPUT, @"('d+|&|'||'(|'))").Where(x => string.IsNullOrEmpty(x) == false);
    if (tokenFunc != null)
    {
        tokens = tokens.Select(tokenFunc);
    }
} 

但这当然会失败,因为您尝试将结果分配给IEnumerable<string>但实际上返回了IEnumerable<int>

要使这一切协同工作,您需要将内容更改为Func<string, string>并返回"0""1",而不是在通话中01

public IEnumerable<string> Tokenize(Func<string, string> tokenFunc = null)
{
    IEnumerable<string> tokens = Regex.Split(INPUT, @"('d+|&|'||'(|'))").Where(x => string.IsNullOrEmpty(x) == false);
    if (tokenFunc != null)
    {
        tokens = tokens.Select(tokenFunc);
    }
} 

并将调用代码更改为:

MyViewObj.Tokenize( (x) => { if(x=="1") return "1"; else return "0"; });

因为您需要一个将字符串作为输入并返回返回类型的 Func:

Func<string,int> tokenFunc