代码之家  ›  专栏  ›  技术社区  ›  Timigen Zachary Cutler

构建数组的通用方法

c#
  •  0
  • Timigen Zachary Cutler  · 技术社区  · 6 年前

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

    这两种情况下都可以通用吗?

    2 回复  |  直到 6 年前
        1
  •  5
  •   Sergey Kalinichenko    6 年前

    您可以创建一个转换 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();
    }
    

    按以下方式调用此方法:

    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

        2
  •  1
  •   Jordan Brooklyn    6 年前

    这对布尔等不可更新的原语不起作用,因此应该避免。只有在这里帮助别人发现这个。

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