5

Dictionary<String, Double>からをサブ選択しようとしていDictionary<String, String>ます。これを行うには、IEnumrable<>.Whereso sub-select a Dictionary<String, String>(動作する) を使用してから、にキャストしますDictionary<String, Double>(動作しません)。

私のコード:

//linesTable is an System.data.DataTable object
//...for loop code in here
DataRow row = linesTable.Rows[i]; //Where i is the loop index
Dictionary<String, String> valuesDictionary 
    = row.Table.Columns.Cast<DataColumn>().ToDictionary(
                col => col.ColumnName, 
                col => row.Field<String>(col.ColumnName));
//ATTEMPT #1
/*Dictionary<String, Double> numericValues = valuesDictionary.Where(
                subs => 
                    { 
                        double doubleValue; 
                        return double.TryParse(subs.Value, out doubleValue);                
                    }).Cast<Dictionary<String, Double>>();*/
//ATTEMPT #2
Dictionary<String, Double> numericValues = valuesDictionary.Where(
    subs => {
        double doubleValue;
        return double.TryParse(subs.Value, out doubleValue);
    }
).ToDictionary<String, Double>(
    pair => pair.Key,
    pair => double.Parse(pair.Value));

私は何を間違っていますか?

形式でそれが必要な理由はDictionary<String, Double>、辞書データを渡す必要があるこの型を受け取るメソッドがあるためです。

前もって感謝します!

同様質問:私の質問は次のようなものです。タイプも。

4

2 に答える 2

4

は1つではないため、にキャストすることはできません。代わりに新しいものを作成する必要があります(または、Konstantinが提案するように、必要がない場合は直接に進んでください)。Dictionary<string, string>Dictionary<string, double>DictionaryDictionary<string,double>Dictionary<string,string>

実際、あなたのコードはあなたが考えていることを実際には実行していません。Cast<Dictionary<string,Double>>()にチェーンしたものは、のWhere()すべてのアイテムをにキャストしようとしてIEnumerableDictionary<string, Double>ます。

代わりにあなたが欲しいのは:

Dictionary<String, Double> numericValues = valuesDictionary
      .Where(
            pair => 
                { 
                    double doubleValue; 
                    return double.TryParse(subs.Value, out doubleValue);                
                })
      .ToDictionary(pair => pair.Key, pair => double.Parse(pair.Value);

つまり、をdouble解析できるすべての場合について、それらを新しいに入れますDictionary<string, double>

もちろん、正規表現などを使用してより美しくすることもできますWhereが、重要な点は、シーケンス内のCast<>()アイテムをキャストすることであり、シーケンス全体をキャストすることではありません。さらに、aは。ではないため、シーケンス全体をキャストすることはできませんDictionary<string,string>Dictionary<string,double>

したがって、新しいが必要でありDictionary、使用ToDictionary()することはそこに到達するための1つのオプションです...

于 2012-12-20T00:12:18.987 に答える
3

必要がない場合はDictionary<String, String>、すぐに作成できます。

Dictionary<String, Double> valuesDictionary =
    row.Table.Columns.Cast<DataColumn>()
                     .Where(col =>
                     {
                         double d;
                         return double.TryParse(row.Field<String>(col.ColumnName), out d);
                     })
                     .ToDictionary(
                         col => col.ColumnName,
                         col => double.Parse(row.Field<String>(col.ColumnName)));
于 2012-12-20T00:12:30.897 に答える