2010-06-14 66 views
2

鉴于这种example使用for循环将自定义对象分配给数组?

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

我如何添加额外的数据到阵列,同时通过一个DataTable循环?

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

这功课吗? – 2010-06-14 18:58:43

+1

'arrayOfCars [] ='让我猜,来自PHP背景? – Powerlord 2010-06-14 19:07:10

+0

@亚当罗宾逊 - 不做作业。尝试修改http://superlist.codeplex.com/相关示例 提供的示例具有静态定义的所有阵列。 – 2010-06-14 19:40:18

回答

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

但他似乎事先知道数组项目的数量,所以为什么不用正确的大小初始化一个数组?我相信混淆来自他尝试使用数组初始化语法将项插入到数组中。 – dtb 2010-06-14 18:58:45

+2

@dtb:他?从这个问题我们不清楚他是从DataTable中完全构建阵列,还是手动构建阵列,然后从DataTable中添加它,有可能在以后或单独的方法中添加到阵列中... – 2010-06-14 19:05:07

+1

这是一个很好的观点dtb ,他正在使用一个DataTable,所以除非他做了一些疯狂的事情,否则你应该有一个固定的大小。当然,从阅读这个例子我不确定他是否太担心速度。 – 2010-06-14 19:11:17

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"])); 
} 
+1

'System.Array.Resize <...>(...)' – 2010-06-14 18:58:39

+0

@Matthew Whited:Array.Resize 本质上创建一个新的数组,从所有项目复制旧数组并返回新数组。它实际上并没有调整旧数组的大小。 List 封装了一个数组,它在需要的时候被调整大小,所以你不必自己调整数组的大小(并且跟踪实际的数量等等) – dtb 2010-06-14 18:59:56

+0

我的观点是你可以调整数组的大小。 – 2010-06-14 19:04:19

1

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

1

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

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

3

一旦创建了一个数组,就不能添加新的元素。但是,您可以将其中的元素重新分配给新对象。如果你想要新的元素(以便你的数组增长)使用(如前所述)通用: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

你也可以使用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); 
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()); 
} 
+0

我喜欢你的方法。扩展是固定的大小,所以这是最好的答案之一。 'List <...>'版本可以工作,但取决于DataTable的大小,这可能导致内部数组的扩展。但是,这些所有细节可能并不意味着性能会比通过字符串索引名称提取列值的影响差不多。所以我同意这个问题的语义是相当无意义的(但是很有趣:o) – 2010-06-14 20:25:23