2013-06-26 2 views
3
IDictionary<string, string> map = str.Split('|') 
            .ToDictionary(s => s.Split('@')[0], s => s.Split('@')[1]); 

Вышеуказанное утверждение работает. Но я хотел бы изменить его на общий для IDictionaryЛямбда с общим

public class CSVMap <TKey, TValue> 
{ 
    public IDictionary<TKey, TValue> func (string str) 
    { 
     IDictionary<TKey, TValue> map = str.Split('|').ToDictionary (ConvertValue<TKey>(s => s.Split('@')[0]), ConvertValue<TValue>(s => s.Split('@')[1])); 

    } 
    public static T ConvertValue<T>(string value) 
    { 
     return (T)Convert.ChangeType(value, typeof(T)); 
    } 

и ConvertValue бросить расщепленные строки к типу TKey и TValue.

Но я получил эти ошибки для ConvertValue частей:

ошибка CS1660: Не удается преобразовать лямбда-выражения к типу «строка», потому что это не тип делегата
ошибка CS1660: Не удается преобразовать лямбда-выражения с типом 'string', потому что это не тип делегата

Я не уверен, что означают ошибки или как решить эту проблему.

+1

Правильный термин «дженерики», а не «шаблоны». Шаблоны - это то, что имеет C++. –

+0

@JohnSaunders: .. * изменить его на ** шаблон ** для IDictionary * <= вы пропустили один .. –

ответ

5

Вы передаете выражение лямбда функции ConvertValue, а не значение. Не уверен, что это делает то, что вы ожидаете, но это правильный синтаксис по крайней мере.

IDictionary<TKey, TValue> map = str.Split('|').ToDictionary (s=>ConvertValue<TKey>(s.Split('@')[0]), s=>ConvertValue<TValue>(s.Split('@')[1]));