繁体   English   中英

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

[英]Assigning custom objects to array with a for loop?

鉴于这个例子

 // 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()); 
} 

一旦创建了数组,就无法向其中添加元素。 使用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());
}

创建数组后,不能添加任何新元素。 但是,您可以将其中的元素重新分配给新对象。 如果你想要新元素(以便你的数组增长)使用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());
}

数组无法就地调整大小。

相反,您应该使用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"]));
}

您也可以使用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);

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

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

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

如果您有.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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM