Назначение пользовательских объектов в массив с помощью цикла for? - PullRequest
2 голосов
/ 14 июня 2010

Учитывая это пример :

 // 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?

ОБНОВЛЕНИЕ 1:

Я согласился с решением, предложенным @ 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 ]

10 голосов
/ 14 июня 2010

Вы не можете добавлять элементы в массив после его создания.Вместо использования массива используйте List<car>.Это позволит вам позвонить. Добавить для добавления элементов.

Например:

 // 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());
}
3 голосов
/ 14 июня 2010

Как только массив создан, новые элементы не могут быть добавлены.Однако вы можете переназначить элементы внутри него новым объектам.Если вы хотите, чтобы новые элементы (чтобы ваш массив рос), используйте (как уже упоминалось) Generic: List<T>.Если вы хотите переназначить уже существующие элементы, используйте что-то вроде следующего (я не скомпилировал это, поэтому вам может потребоваться внести изменения)

2 голосов
/ 14 июня 2010

Вы также можете использовать 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);
2 голосов
/ 14 июня 2010

Массивы не могут быть изменены на месте.

Вместо этого вы должны использовать 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 голос
/ 14 июня 2010

Если у вас есть .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());
}
1 голос
/ 14 июня 2010

Как сказано выше - используйте List<Car> для получения списка с динамическим количеством элементов - используйте метод Add(Car item) для добавления новых экземпляров.Обязательно посетите соответствующий сайт MSDN: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx

Кстати: оператор [] не работает в C #, даже если вы создали массив, например, с 5 элементами и хотите добавить первый.

1 голос
/ 14 июня 2010

Я бы рекомендовал использовать массив только в том случае, если вы знаете, сколько всего у вас будет элементов. В противном случае вам лучше использовать Список, как предложили Рид и Слакс.

...