如何在C#中将ArrayList转换为整数数组

3

这是我的代码

    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"));

以下错误出现:"源数组中至少有一个元素无法向下转换为目标数组类型。"
请提供一种解决方案或其他替代方法。

你想要做什么?SS和qq的类型是什么? - Tony The Lion
qq 是 DataReaderss 是 ArrayList我需要来自名为 aa 的列的全部数据 - ush
你使用的是哪个版本的.NET? - Jon Skeet
听起来 values 包含的不是整数。 - Will Vousden
猜测一下:你的结果集中可能有NULL(DBNull)值? - Doc Brown
6个回答

7
如果您的 ArrayList ss 中存在非整数对象,则需要指定是失败还是忽略它们。

假设您想忽略它们,那么您可以使用 LINQ:

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

(假设您已经在作用域中使用了using System.Linq。)
(注:此段内容为说明,无需翻译)

2
不要使用ArrayList,使用List<int>即可免费获得所需的int数组。
如果您想引用表示System.Int32的System.Type,我更喜欢使用typeof(int)而不是字符串字面量和这种不必要的查找。
顺便说一下,这些标识符很难阅读——当您提出问题时,可能需要使它们更易于理解。
其他帖子指出了真正的问题:您将数组添加到列表中,而这些数组并不是整数。也许(?)是整数数组,但如果没有更多细节,我们就不知道了。

1
据我所知,您放入ss中的元素似乎是数组本身。
然后,您尝试将这些数组转换为整数,这显然行不通。
您应该做的是类似于:
while (qq.Read())
{
    //object[] values = new object[qq.FieldCount]; - Necessary?
    //qq.GetValues(values); - Necessary?
    ss.Add(qq["aa"]);
}

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

否则,您必须手动遍历ArrayList。

0

可能是您的某个值无法转换为Int32。更好的方法是使用通用的List类型。它的行为类似于ArrayList,但只接受Int32值。然后,您可以使用ToArray()方法返回一个真正的Int32[]数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接