无法推断DataTable类型参数

时间:2017-11-08 14:55:54

标签: c# lambda datatable

在下面的代码中,我为参数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);
}

2 个答案:

答案 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);