2010-06-14 95 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