You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

数组对象索引查询及C#学生位置查询程序异常排查

技术问题解答

问题一:如何在元素类型未知的数组中查找指定对象的索引?

在C#里处理这种元素类型未知的数组,其实可以借助Array类的通用静态方法来解决,核心是分情况处理对象的相等性判断:

  • 值类型数组:直接用Array.IndexOf()就可以,因为值类型默认是按值比较的,比如intdouble这类数组,传入数组和目标值就能拿到索引。
  • 引用类型数组:默认是比较对象的引用地址,如果要按对象的内容匹配,要么给你的类重写Equals()GetHashCode()方法,要么用Array.FindIndex()配合自定义的lambda表达式来做内容比对。

举两个实际的例子:

示例1:值类型数组查找

int[] numbers = { 5, 2, 8, 1 };
int target = 8;
int index = Array.IndexOf(numbers, target);
// 这里index会返回2,因为8在数组的第3个位置(索引从0开始)

示例2:引用类型数组查找

如果是自定义类的数组,比如Person类,我们可以用两种方式:

方式1:重写Equals方法

public class Person
{
    public string FirstName { get; set; }
    public int Age { get; set; }

    // 重写Equals,按内容比较
    public override bool Equals(object obj)
    {
        if (obj is Person other)
        {
            return FirstName == other.FirstName && Age == other.Age;
        }
        return false;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(FirstName, Age);
    }
}

// 查找逻辑
Person[] people = { new Person { FirstName = "Luna", Age = 22 }, new Person { FirstName = "Leo", Age = 25 } };
Person targetPerson = new Person { FirstName = "Leo", Age = 25 };
int personIndex = Array.IndexOf(people, targetPerson);
// 这里personIndex返回1

方式2:用Array.FindIndex自定义匹配逻辑

如果不想重写Equals方法,直接用lambda表达式指定匹配规则更灵活:

int personIndex = Array.FindIndex(people, p => p.FirstName == "Leo" && p.Age == 25);

不管数组元素是什么类型,这两种方式都能帮你找到目标对象的索引。

问题二:排查C#程序始终返回索引0的原因

先看你贴的代码,问题其实很明显——你的程序根本没实现“查找学生位置”的核心逻辑

具体问题分析:

  1. index变量从一开始就被初始化为0,之后在整个代码里完全没有被修改过,不管输入什么,最后返回它的话肯定是0;
  2. 你定义了存储姓的b数组和年龄的c数组,但代码里根本没用到它们,连输入逻辑都没写;
  3. 最关键的是,没有“输入要查找的学生名字、遍历数组匹配、更新index值”的代码块,等于查找功能完全缺失。

修复后的示例代码

我给你补全了完整的逻辑,你可以参考:

public class Program_pinakes {
    public static void Main(string[] args) {
        int i;
        // 把变量名改成有意义的,避免a/b/c这种模糊命名
        string[] firstNames = new string[10];
        string[] lastNames = new string[10];
        int[] ages = new int[10];
        // 初始化为-1,表示未找到的状态,比0更合理
        int index = -1;

        // 输入10名学生的完整信息
        for (i = 0; i < 10; i++) {
            Console.Write($"第{i+1}个学生 - 名: ");
            firstNames[i] = Console.ReadLine();
            Console.Write($"第{i+1}个学生 - 姓: ");
            lastNames[i] = Console.ReadLine();
            Console.Write($"第{i+1}个学生 - 年龄: ");
            // 这里最好加个异常处理,防止输入非数字
            ages[i] = int.Parse(Console.ReadLine());
        }

        // 输入要查找的学生名字(这里按名查找,你也可以改成全名)
        Console.Write("请输入要查找的学生名字: ");
        string targetName = Console.ReadLine();

        // 遍历数组查找匹配项
        for (i = 0; i < 10; i++) {
            if (firstNames[i].Equals(targetName, StringComparison.OrdinalIgnoreCase)) {
                index = i;
                break; // 找到后直接退出循环,不用继续遍历
            }
        }

        // 输出结果
        if (index != -1) {
            Console.WriteLine($"找到该学生,位置索引为: {index}");
        } else {
            Console.WriteLine("未找到匹配的学生");
        }
    }
}

关键修复点:

  • index初始化为-1,用来区分“未找到”和“索引0”的情况;
  • 补全了姓和年龄的输入逻辑,用到了你之前定义的数组;
  • 添加了查找目标学生的遍历逻辑,找到匹配项后更新index的值;
  • 加入了忽略大小写的字符串比较,让查找更友好;
  • 最后根据index的值输出对应的结果,而不是直接返回初始值。

简单说,你原来的程序返回0,就是因为index从来没被修改过,一直保持着初始化的0值。

内容的提问来源于stack exchange,提问作者Sts013

火山引擎 最新活动