Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 构建数组的通用方法_C# - Fatal编程技术网

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;
}