2010-01-04 5 views
2

Это мой кодкак преобразовать ArrayList в массив целых чисел в C#

con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:/techsoft /PP1.accdb;Persist Security Info=False"); 
     con.Open(); 
     cm = new OleDbCommand("select aa from ab", con); 
     OleDbDataReader qq; 
     qq = cm.ExecuteReader(); 
     ArrayList ss = new ArrayList(); 

     while (qq.Read()) 
     { 
      object[] values = new object[qq.FieldCount]; 
      qq.GetValues(values); 
      ss.Add(values); 



     } 

если я использовать этот синтаксис для преобразования

int[] i = (int[])ss.ToArray(System.Type.GetType("System.Int32")); 

следующая ошибка "По крайней мере, один элемент в исходном массиве не может быть отброшен до типа массива адресата. "

плз предложить мне одно решение или любой другой альтернативный способ

+0

Что вы пытаетесь сделать?Каков тип SS и qq? –

+0

qq is datareader ss is arraylist Мне нужны целые данные из столбца с именем aa – ush

+0

Какую версию .NET вы используете? –

ответ

1

Насколько я могу сказать, что элементы, которые вы помещаете в сс появляются быть массивы сами.

Затем вы пытаетесь применить эти массивы к ints, которые, очевидно, не будут работать.

Что вы должны сделать, это что-то вроде:

while (qq.Read()) 
{ 
    //object[] values = new object[qq.FieldCount]; - Necessary? 
    //qq.GetValues(values); - Necessary? 
    ss.Add(qq["aa"]); 
} 
+0

Благодарим вас за то, что он хорошо работает – ush

+0

. Добро пожаловать, не стесняйтесь отмечать это как принятый ответ;) – Paolo

2

Не используйте ArrayList, пойти на List<int> и вы получите то, что вы хотите бесплатно (целочисленный массив из списка).

Если вы хотите ссылаться на System.Type, который представляет System.Int32, я бы предпочел typeof(int) без строковых литералов и этот ненужный поиск.

Идентификаторы трудно читать, кстати, вы можете сделать их более понятными, когда задаете вопрос.

Реальная проблема была идентифицирована другими плакатами: вы добавляете массивы в список, который не является целым числом. Может быть (?) Массивы целых чисел, но мы не знали бы более подробно.

3

Если есть объекты, которые не являются целыми числами в ss, то вам нужно указать, следует ли отказывать или игнорировать их.

Предполагая, что вы хотите, чтобы их игнорировать, то вы можете использовать LINQ:

int[] res = ss.OfType<int>().ToArray(); 

(Предполагая, что вы имеете в объеме в using System.Linq.)

0

Может быть, один из значений не могут быть преобразованы в Int32. Лучшим подходом было бы использовать общий тип List. Это ведет себя как ArrayList, но только принимает значения Int32. Затем вы можете использовать метод ToArray(), который возвращает реальный массив Int32 [].

0

Для этого я бы использовал строго типизированный номер List<int>. Кроме того, поскольку вы только выбрать одно поле из таблицы, я бы сказал, что ваш код может быть немного упрощен:

List<int> myInts = newList<int>(); 

using(IDataReader reader = cm.ExecuteReader()) { 
    while (reader.Read()) 
    { 
     myInts.Add(int.Parse(reader["aa"].ToString())); 
    } 
} 

Тогда вы могли бы просто сделать

myInts.ToArray(); 
0

Если вы используете по крайней мере .NET 3.5:

using System.Linq; 

//... 

int[] myArray = ss.Cast<int>().ToArray(); 

в противном случае, у вас есть foreach через ArrayList вручную.

Смежные вопросы