建立数组的通用方法

时间:2018-09-07 17:24:35

标签: c#

下面是我实现的方法的简化示例。

return $this->httpKernel->handle(Request::create($uri), HttpKernelInterface::SUB_REQUEST);

除了要返回对象数组之外,我还有另一个用例:

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

是否可以使其通用到足以在两种情况下使用?

2 个答案:

答案 0 :(得分:5)

您可以创建一个方法,将输入double[]转换为带有lambda的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();
}

像这样调用此方法:

double[] res1 = Convert(input, d => d * 3.14);
Series[] res2 = Convert(input, (d, i) => new Series(i, input[i] * 3.14));

请注意,由于转换是一行,因此您最好直接使用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方法即可看到它的作用。

答案 1 :(得分:1)

这对于不可更新的原语(例如布尔值)将不起作用,因此应避免使用。仅在这里可以帮助其他人发现这一点。

您可以创建具有可更新项约束的通用方法

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