在下面的代码中,我为参数datatable中的每一行添加了一个parameterValue。
但是,我收到以下错误:
“无法从用法中推断出方法'EnumerableRowCollectionExtensions.Select(EnumerableRowCollection,Func)'的类型参数。请尝试明确指定类型参数。”
有人可以帮我理解我需要在代码中明确定义的类型参数吗?
以下是包含错误的代码:
parameters.AsEnumerable().Select(x =>
{
ParameterValue parameterValue = new ParameterValue();
parameterValue.Name = x["name"].ToString();
parameterValue.Value = x["value"].ToString();
parameterList.Add(parameterValue);
});
这在foreach循环中工作正常。这是代码:
foreach (DataRow row in parameters.Rows)
{
ParameterValue parameterValue = new ParameterValue();
parameterValue.Name = row["name"].ToString();
parameterValue.Value = row["value"].ToString();
parameterList.Add(parameterValue);
}
答案 0 :(得分:3)
的正确语法
parameters.AsEnumerable().Select(x =>
{
ParameterValue parameterValue = new ParameterValue();
parameterValue.Name = x["name"].ToString();
parameterValue.Value = x["value"].ToString();
parameterList.Add(parameterValue);
});
是
parameterList.AddRange(parameters.AsEnumerable().Select(x =>
new ParameterValue()
{
Name = x["name"].ToString(),
Value = x["value"].ToString()
}));
旁注:
您应该按类型x["name"].ToString()
x.Field<string>("name")
答案 1 :(得分:1)
Enumerable.Select是投影方法。它将类型为TSource
的每个输入项目投影到TResult
类型的新表单中。因此,它接受一个选择器委托,它执行此TSource&gt; TResult投影。您的选择器委托如下所示:
x =>
{
ParameterValue parameterValue = new ParameterValue();
parameterValue.Name = x["name"].ToString();
parameterValue.Value = x["value"].ToString();
parameterList.Add(parameterValue);
}
即。它需要DataRow
作为TSource并将其投射到......没有。您不会从此委托返回任何值。因此,编译器无法理解它应该使用哪个TResult
。
现在解决方案。实际上,你想在这里做两个动作:
ParameterValue
第一部分是投影。只需使用委托将DataRow
作为TSource并返回ParameterValue
作为TResult:
x => new ParameterValue{ Name = x.Field<string>("name"), Value = x.Field<string>("value") }
第二部分可以通过两种方式完成。您可以从所有参数值创建新列表。这是一种声明式的编程风格 - 而不是指定如何添加值列表,你只需说“我想要列表&#39;:
var parameterList = parameters.AsEnumerable()
.Select(r => new ParameterValue {
Name = r.Field<string>("name"), // note this LINQ to DataSet syntax
Value = r.Field<string>("value")
}).ToList();
或者您可以使用简单的foreach循环将每个投影值逐个添加到现有列表中。但在这里我会使用查询语法进行投影:
var parameterValues = from r in parameters.AsEnumerable()
select new ParameterValue {
Name = r.Field<string>("name"),
Value = r.Field<string>("value")
};
foreach(var parameterValue in parameterValues)
parameterList.Add(parameterValue);