c#使用方法初始化某些数组

时间:2012-02-23 18:18:14

标签: c# arrays initialization

我正在尝试使用方法初始化新创建的空数组。以下示例。 这是我想要创建的代码的结构。

var v = exClass[5,5];
v.ExtensionMethodThatWillInitilize();

我想要的ExtensionMethodThatWIllInitilize要做的是:

for(int y = 0 ; y < exClass.getLength(0); y++ ) {
for(int x = 0 ; x < exClass.getLength(1); x++ ) {
v[y,x] = new instanceObject();
}}

所以我提出了以下代码......

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        var oldEx = new ExClass[10, 10];
        var newEx = oldEx.init();
    }
}
public class ExClass
{
    public string exString
    public ExClass() {
    exString = " I AM NEW! YES! ";
 }
}
public static class tools
{
    static public ExClass[,] init(this ExClass[,] start)
    {
        var newArray = new ExClass[start.GetLength(0), start.GetLength(1)];
        for (int y = 0; y < start.GetLength(0); y++)
        {
            for (int x = 0; x < start.GetLength(1); x++)
            {
              newArray[y, x] = new ExClass();
            }
        }
        return newArray;
    }
}

然而问题是我不知道如何修改我的init方法,以便它可以采用任何类型的数组并返回已初始化的相应数组。 我尝试使用泛型T,但我缺乏经验似乎失败了。

综述:

1)你如何想出一个能在一步中初始化空数组的方法。

2)如何确保该方法可以初始化任何类型的数组(假设数组中的元素具有不带任何参数的构造函数)

2 个答案:

答案 0 :(得分:1)

泛型确实有用。您需要将方法声明为泛型类型。

我修改了上面的例子如下:

class Program
{
    static void Main(string[] args)
    {
        var oldEx = new ExClass[10, 10];
        var newEx = oldEx.init<ExClass>();
    }
}
public class ExClass
{
    public string exString = "I AM NEW";
}
public static class tools
{
    static public T[,] init<T>(this T[,] start)
    {
        var newArray = new T[start.GetLength(0), start.GetLength(1)];
        for (int y = 0; y < start.GetLength(0); y++)
        {
            for (int x = 0; x < start.GetLength(1); x++)
            {
                newArray[y, x] = Activator.CreateInstance<T>();
            }
        }
        return newArray;
    }
}

作为对以下评论的回答:

class Program
{
    static void Main(string[] args)
    {
        var oldEx = tools.init<ExClass>(10, 10);

    }
}
public class ExClass
{
    public string exString = "I AM NEW";
}
public static class tools
{
    static public T[,] init<T>(int x,int y)
    {
        var newArray = new T[x, y];
        for (int i = 0; i < x; i++)
        {
            for (int j = 0; j < y; j++)
            {
                newArray[i, j] = Activator.CreateInstance<T>();
            }
        }
        return newArray;
    }
}

答案 1 :(得分:1)

查看此泛型方法,该方法使用new通用约束:

 static public void Init<T>(this T[,] array) where T : new()
 {
    for (int y = 0; y < array.GetLength(0); y++)
    {
       for (int x = 0; x < array.GetLength(1); x++)
       {
          array[y, x] = new T();
       }
    }
  }

与您的代码的主要区别是:

1)方法是Init指定一个通用参数,where T : new()约束确保我们可以调用new T();

2)我只是在原地初始化数组,而不是返回一个新的初始化数组。似乎更符合逻辑。如果你愿意,你可以使用原始版本,但我不明白为什么你需要。