2017-11-08 31 views
1

以下のコードでは、パラメータのdatatableの各行にparameterValueを追加します。DataTable型の引数を推論できません

しかし、私は次のエラーを取得しています:

「方法 『EnumerableRowCollectionExtensions.Select(EnumerableRowCollection、機能)』の型引数は、使用状況から推測することはできません明示的に型引数を指定してみてください。」

コードで明示的に定義する必要があるタイプ引数がわかってもらえますか?ここで

はエラーとコードです:

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); 
} 
+1

'選択'は、目的のオブジェクトを返す関数が必要です。 'ForEach'や' Apply'の同義語ではありません。実際には、それは副作用があってはならない –

+0

https://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question – Raedwald

答えて

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")

+0

' parameterList'は、おそらく 'AddRange'メソッドを持っていません。私は変数にクエリを格納し、 'foreach'を使ってそれを次々と追加したり、サポートされていれば' AddRange(allParameterValues) 'を使います。 –

+0

@TimSchmelter:私の謝罪。パラメータリストは次のとおりです。List parameterList = new List (); – rds80

+0

@fuboはタイプセーフティのため、フィールドを使用していますか? – rds80

1

Enumerable.Select投影メソッドです。 TSourceの各入力項目を新しい形式のTResultに投影します。したがって、このTSource> TResult投影を行うセレクタデリゲートを受け入れます。セレクタデリゲートは次のようになります。

x => 
{ 
    ParameterValue parameterValue = new ParameterValue(); 
    parameterValue.Name = x["name"].ToString(); 
    parameterValue.Value = x["value"].ToString(); 
    parameterList.Add(parameterValue); 
} 

TSourceとしてDataRowが必要で、何も投影しません。このデリゲートからの値は返されません。したがって、コンパイラはどちらを使用すべきか理解できません。

今解決してください。実際に、あなたはここで二つの動作やりたい:リストに投影された各値を追加ParameterValue

    • プロジェクト各行を

    (新規または既存の)最初の部分は突起です。

    x => new ParameterValue{ Name = x.Field<string>("name"), Value = x.Field<string>("value") } 
    

    第二部は、2つの方法で行うことができます:ちょうどTSOURCEとしてDataRowを取り、TResultとしてParameterValueを返すデリゲートを使用します。すべてのパラメータ値から新しいリストを作成できます。これは、プログラミングの宣言型のスタイルです - 代わりにあなただけの「私はリストをしたい」と言っリストに値を追加する方法を指定する:

    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(); 
    

    それとも、1つずつ投影値1を追加するために、単純な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); 
    
  • 関連する問題