C#LINQ-无法从用法中指定类型参数

时间:2019-07-12 01:50:13

标签: c# linq

我正在编写一个函数来解析字符串输入,以将所有整数放入列表中。但是,我遇到了一个错误:

方法的类型参数

System.Linq.Enumerable.SelectMany<TSource,TResult>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,System.Collections.Generic.IEnumerable<TResult>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

现在,我尝试指定它们,但无济于事。

代码的逻辑(使用示例输入“ 56#3 = 45#90”)为:

因此,我将"56#3=45#90" (on '=')拆分为{"56#3", "45#90"}的字符串数组,以供Select操作,它将(on '#')拆分为  包含IEnumerable(string)的Enumerable("{"56", "3"},{"45", "90"})。最后,应该将SelectMany的结构展平(并转换为int)为{56, 3, 45, 90},该结构应该可以转换为列表。

我看不出指定类型参数有什么问题的任何原因。

// string 'a' contains "<int>#<int>=<int>#<int>" such as "56#3=45#90";
public static IList<int> ParseCKPInput(string a)  
{
        return (a.Split('=')).Select(n => n.Split('#')).SelectMany(n => Convert.ToInt32(n)).ToList();
}

我知道这可以通过正则表达式来完成(我已经实现了);但是,我想提高对LINQ的理解,并弄清楚原始代码有什么问题。谢谢大家!

1 个答案:

答案 0 :(得分:1)

.SelectMany(n => Convert.ToInt32(n))不起作用的原因是,n将是一个列表,并且您无法将列表转换为整数。

查询应为:

return a.Split('=')
        .Select(n => n.Split('#'))
        .SelectMany(x => x)
        .Select(x => Convert.ToInt32(x))
        .ToList();

或者...无需拼合,只需一次传递所有拆分字符

return a.Split('=', '#')
        .Select(x => Convert.ToInt32(x))
        .ToList();