c# - C# 数组中的 System.InvalidCastException 错误

标签 c# arrays sorting

我试图运行一个可以读取数组中的奇数和偶数的程序,但不断出现的错误是System.InvalidCastException。这是代码:

ArrayList Num = new ArrayList();

Console.WriteLine("Enter 5 numbers");

for (int i = 0; 5 > i; i++)
{
    Console.Write((i + 1) + ". ");
    Num.Add(Console.ReadLine());
}

Num.Sort();

Console.Write("Sorted numbers: ");
foreach (string value in Num)
{
    Console.Write(value + " ");
}

Console.ReadLine();

ArrayList odd = new ArrayList();
ArrayList even = new ArrayList();

foreach (int value in Num)
{      
    if (value % 2 != 0)
    {
        odd.Add(value);
    }

    else
    {
        even.Add(value);
    }

}

Console.Write("Odd numbers: ");
foreach (string number in odd)
{
    Console.Write(number + " ");
}

Console.Write("Even numbers: ");
foreach (string numbers in even)
{
    Console.Write(numbers + " ");
}

Console.ReadLine();

错误表明我的int value code it's value 无法转换。谁能教我解决这个错误的正确方法?

最佳答案

好的,让我们从头开始。如果您查看 Console.ReadLine 的返回值,您将看到它返回 string :

Return Value
Type: System.String

ArrayList 可以包含不同类型的对象。您的代码编译得很好,因为 Num 掩盖了对象类型之间的差异。

当您稍后尝试遍历 ArrayList Num 时,您假设其中的每个元素都是 int 类型:

foreach (int value in Num)

但它不是!你已经用字符串填充了它。当编译器到达这一行时,它会尝试隐式地将每个元素转换为 int(因为你这样告诉它)但是一个简单的转换形式 stringint 会导致你遇到的那个异常

这里可以找到几个解决方案......

1)
您可以将循环中的对象视为它们的类型,即 object 。然后在每次迭代中,您可以尝试使用 TryParse 将它们转换为 int,如果转换有效,您可以将它们添加到您的列表中:

foreach (object value in Num)
{
    int intvalue = 0;

    if (Int32.TryParse(value.ToString(), out intvalue)
    {
        if (intvalue % 2 != 0)
        {
            odd.Add(intvalue);
        }
        else
        {
            even.Add(intvalue);
        }
    }
}

2)
另一种可能性是当您从控制台读取数字时立即转换数字并选择适合所讨论类型的集合,即 int .例如一个通用的 List

List<int> Num_Int_List = new List<int>();

for (int i = 0; 5 > i; i++)
{
    Console.Write((i + 1) + ". ");
    if (int.TryParse(Console.ReadLine(), out enteredNumber)
    {
        Num_Int_List.Add(enteredNumber);
    }
    else
    {
        Console.WriteLine("Sorry that was not an integer, try again please");
        i-- // here set the counter to the last step to allow the user to repeat the step
    }
}

将相同的集合 List<int> 用于 oddeven,您可以按原样使用 foreach 循环:

List<int> odd = new List<int>();
List<int> even = new List<int>();

选择像 List<int> 这样的类型安全集合将帮助您解决与编译时已经存在的类型的不兼容性,而不是像您的情况那样在运行时

关于c# - C# 数组中的 System.InvalidCastException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48781936/

相关文章:

c# - 如何创建可以与网站交互的 win 应用程序?

java - 在旋转数组中找到最小值。了解实现

javascript - 如何在 JavaScript 中拆分数组的查询字符串

linux - 从许多 csv 文件中删除重复项

string - 什么是字典顺序?

c# - 自定义 Linq 扩展的性能差异/改进

c# - DateTime.ParseExact 不适用于 "yyyy-MM-dd HH:mm:ss"

c# - 如果不在 .NET 中使用不安全代码,是否可以实现高效的固定大小数组?

ios - 最佳实践 - 在 Swift 中对混合对象进行排序

java - 将 "tokens"添加到数组