【发布时间】:2010-12-24 12:39:15
【问题描述】:
这是一些代码,它不会编译,但本质上我想要创建一个函数,它解析为 CSV 文件,然后将 CSV 列表中的值转换为特定类型。
Func<string, Func<string,T>, IEnumerable<T>> parser =(string csv, Func<string, T> newFunc) =>
{
List<T> items = new List<T>();
string[] ary = csv.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
foreach (string val in ary)
{
try
{
items.Add(newFunc(val));
}
catch { }
}
return items;
}
我希望这个函数是通用的,所以 T 是我希望将 CSV 列表转换为的类型。这个函数的用法是这样的:
string csvList ="1,2,3";
IEnumerable<int> list = parser(csvList, (string val) => { return Convert.ToInt32(val)});
但是这显然行不通,因为我还没有定义 T。所以是否可以以类似于这样的泛型方法的方式定义 T:
Func<T><string, Func<string,T>, IEnumerable<T>> parser =(string csv, Func<string, T> newFunc) =>
{
List<T> items = new List<T>();
string[] ary = csv.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
foreach (string val in ary)
{
try
{
items.Add(newFunc(val));
}
catch { }
}
return items;
}
然后像这样使用它:
string csvList ="1,2,3";
IEnumerable<int> list = parser<int>(csvList, (string val) => { return Convert.ToInt32(val)});
有没有办法在 C# 中做这样的事情?
-- 进一步编辑
感谢您的回复,在我编写的代码中,我实际上使用了您所描述的方法,但是我想知道是否可以在不需要方法的情况下将其作为 Func 执行称呼。
【问题讨论】:
-
这个函数式编程怎么样?因为你在写一个 C# 函数?
-
旁注:如果您要重新发明 CSV 解析器,请记住正确处理引用的值(尤其是包含逗号的值)。
标签: c# .net generics functional-programming function