这是一些代码,它不会编译,但本质上我想要创建的是一个解析为 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 来执行而不需要方法称呼。
最佳答案
也许我错过了一些东西,但我认为这就是你需要的:
public IEnumerable<T> Parse<T>(string csv, Func<string, T> func)
{
foreach(var item in csv.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries))
{
yield return func(item);
}
}
关于c# - C# 中的泛型和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1868617/