C# 构建数组的通用方法
下面是我实现的一个方法的简化示例C# 构建数组的通用方法,c#,C#,下面是我实现的一个方法的简化示例 public double[] CreateArray(double[] input) { var output = new double[10]; for (int i = 0; i < 10; ++i) { output[i] = input[i] * 3.14; } return output; } public double[]创建数组(double[]输入) { var输出=新的双精度[10]; 对于(int
public double[] CreateArray(double[] input)
{
var output = new double[10];
for (int i = 0; i < 10; ++i)
{
output[i] = input[i] * 3.14;
}
return output;
}
public double[]创建数组(double[]输入)
{
var输出=新的双精度[10];
对于(int i=0;i<10;++i)
{
输出[i]=输入[i]*3.14;
}
返回输出;
}
我有另一个与此相同的用例,只是我想返回一个对象数组:
public Series[] CreateArray(double[] input)
{
var output = new Series[10];
for (int i = 0; i < 10; ++i)
{
output[i] = new Series(i, input[i] * 3.14);
}
return output;
}
public Series[]创建数组(双[]输入)
{
var输出=新系列[10];
对于(int i=0;i<10;++i)
{
输出[i]=新系列(i,输入[i]*3.14);
}
返回输出;
}
这是否可以变得足够通用以在任何情况下使用?您可以使用lambda创建一个方法,将
double[]
输入转换为某些T
:
static T[] Convert<T>(IEnumerable<double> input, Func<double,T> converter) {
return input.Select(converter).ToArray();
}
static T[] Convert<T>(IEnumerable<double> input, Func<double,int,T> converter) {
return input.Select(converter).ToArray();
}
请注意,由于转换是单行,因此您最好直接使用Select
:
double[] res1 = input.Select(d => d * 3.14).ToArray();
Series[] res2 = input.Select((d, i) => new Series(i, input[i] * 3.14)).ToArray();
直接LINQ方法为您的用户提供了“即时熟悉”,因为他们不必导航到您的Convert
方法来查看它的功能。这对布尔等不可更新的原语不起作用,因此应该避免使用。只有在这里才能帮助其他人发现这一点。
您可以创建一个通用方法,该方法带有一个约束,即该项是可更新的
public T[] CreateArray<T>(double[] input) where T: new()
{
var output = new T[10];
for (int i = 0; i < 10; ++i)
{
output[i] = (T) Activator.CreateInstance(typeof(T), new object[] { i, input[i] * 3.14 });;
}
return output;
}
public T[]创建数组(双[]输入),其中T:new()
{
var输出=新的T[10];
对于(int i=0;i<10;++i)
{
输出[i]=(T)Activator.CreateInstance(typeof(T),新对象[]{i,输入[i]*3.14});;
}
返回输出;
}
这不适用于double类型或其他非Series类型的类类型。@RyanWilson您完全正确。我已经更新了这个项目,所以人们知道要避免这个解决方案(不要重复我的错误!),这是一次勇敢的尝试。
public T[] CreateArray<T>(double[] input) where T: new()
{
var output = new T[10];
for (int i = 0; i < 10; ++i)
{
output[i] = (T) Activator.CreateInstance(typeof(T), new object[] { i, input[i] * 3.14 });;
}
return output;
}