使用for循环将自定义对象分配给数组?

时间:2010-06-14 18:49:02

标签: c# winforms arrays .net-3.5 datatable

鉴于此example

 // Create an arary of car objects.      
     car[] arrayOfCars= new car[]
     {
        new car("Ford",1992),
        new car("Fiat",1988),
        new car("Buick",1932),
        new car("Ford",1932),
        new car("Dodge",1999),
        new car("Honda",1977)
     };

我试过这样的事情:

for (int i = 0; i < dtable.Rows.Count; i++)
{
    DataRow drow = dtable.Rows[i];
    arrayOfCars[] =  new car(drow["make"].ToString(), drow["year"].ToString());
}

如何在循环数据表时向阵列添加其他数据?

UPDATE1:

我选择了@Reed提出的解决方案。

// Create the array, specifying the total length 
car[] arrayOfCars = new car[dtable.Rows.Count]; 

for (int i = 0; i < dtable.Rows.Count; i++) 
{ 
    DataRow drow = dtable.Rows[i]; 
    // Assign each car to the specific index within the array (arrayOfCars[i]) 
    arrayOfCars[i] =  new car(drow["make"].ToString(), drow["year"].ToString()); 
} 

7 个答案:

答案 0 :(得分:10)

创建数组后,无法将元素添加到数组中。不使用数组,而是使用List<car>。这将允许您调用.Add来添加元素。

例如:

 // Create an List of car objects.      
 List<car> listOfCars = new List<car>()
 {
    new car("Ford",1992),
    new car("Fiat",1988),
    new car("Buick",1932),
    new car("Ford",1932),
    new car("Dodge",1999),
    new car("Honda",1977)
 };

然后你可以这样做:

for (int i = 0; i < dtable.Rows.Count; i++)
{
    DataRow drow = dtable.Rows[i];
    listOfCars.Add(new car(drow["make"].ToString(), drow["year"].ToString()));
}

您可以像使用数组一样使用listOfCars,并按索引访问元素:

car myCar = listOfCars[3];

如果你必须有一个数组,请在完成“添加到列表”之后通过调用列表中的ToArray()来创建它:

// ... Add as above...
car[] arrayOfCars = listOfCars.ToArray(); // Creates an array from your list

编辑:

如果您只是尝试从DataTable中分配和构造数组,并且在构造之后不需要向其添加元素,则可以使用数组,如下所示:

// Create the array, specifying the total length
car[] arrayOfCars = new car[dtable.Rows.Count];

for (int i = 0; i < dtable.Rows.Count; i++)
{
    DataRow drow = dtable.Rows[i];
    // Assign each car to the specific index within the array (arrayOfCars[i])
    arrayOfCars[i] =  new car(drow["make"].ToString(), drow["year"].ToString());
}

答案 1 :(得分:3)

创建数组后,不能添加任何新元素。但是,您可以将其中的元素重新分配给新对象。如果你想要新的元素(以便你的数组增长)使用Generic:List<T>(如上所述)。如果你想重新分配已经存在的元素,请使用以下内容(我没有编译它,所以你可能需要进行更改:)

for(int i = 0; i < dtable.Rows.Count; i++)
{
    DataRow drow = dtable.Rows[i];
    cars[i] = new car(drow["make"].ToString(), drow["model"].ToString());
}

答案 2 :(得分:2)

阵列无法就地调整大小。

相反,您应该使用List<Car>并致电Add,如下所示:

 List<car> cars= new List<car>()
 {
    new car("Ford",1992),
    new car("Fiat",1988),
    new car("Buick",1932),
    new car("Ford",1932),
    new car("Dodge",1999),
    new car("Honda",1977)
 };  //C# 3 collection initializer

for (int i = 0; i < dtable.Rows.Count; i++)
{
    DataRow drow = dtable.Rows[i];
    cars.Add(new car((string)drow["make"], (int)drow["year"]));
}

答案 3 :(得分:2)

您也可以使用LINQ来执行此操作...

var fromTable = from row in dtable.Rows.OfType<DataRow>()
                let make = row["make"] as string
                let year = (int)row["year"]
                select new car(make, year);

car[] arrayOfCars = listOfCars.Concat(fromTable).ToArray();

...如果DataTable中有大量行,并且您想尝试挤出一些性能,那么您可以这样做......

var makeIndex = dtable.Columns["make"].Ordinal;
var yearIndex = dtable.Columns["year"].Ordinal;

var fromTable = from row in dtable.Rows.OfType<DataRow>()
                let items = row.ItemArray
                let make = items[makeIndex] as string
                let year = (int)items[yearIndex]
                select new car(make, year);

答案 4 :(得分:1)

如果您知道总数中有多少元素,我建议您使用数组。否则你最好使用List作为Reed和SLaks建议。

答案 5 :(得分:1)

如上所述 - 使用List<Car>来获得包含动态数量元素的列表 - 使用方法Add(Car item)添加新实例。请务必访问相应的MSDN网站:http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx

顺便说一句:操作符[]在C#中不起作用,即使你创建了一个数组,例如5个元素并想添加第一个元素。

答案 6 :(得分:1)

如果您有.NET 3.5,请使用Array.Resize()。

// Create an arary of car objects.      
     car[] arrayOfCars= new car[]
     {
        new car("Ford",1992),
        new car("Fiat",1988),
        new car("Buick",1932),
        new car("Ford",1932),
        new car("Dodge",1999),
        new car("Honda",1977)
     };    

// resize the array...
var rowCount = dtable.Rows.Count;
var offSet = arrayOfCars.Length;
Array.Resize<car>(ref arrayOfCars, rowCount + offSet);

// populate the new (empty) array elements from the database...
for (int i = 0; i < rowCount; i++)
{
    DataRow drow = dtable.Rows[i];
    arrayOfCars[i + offSet] =  
      new car(drow["make"].ToString(), drow["year"].ToString());
}