我正在编写一个函数来解析字符串输入,以将所有整数放入列表中。但是,我遇到了一个错误:
方法的类型参数
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的理解,并弄清楚原始代码有什么问题。谢谢大家!
答案 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();