C# 控制台程序索引器仅在我的列表 <> 中找到第一项

C# Console Program Indexer only finds the FIRST item in my List<>

下面是一个包含三个 类 的非常基本的程序,它使用索引器根据年龄在 List<> 中搜索一个人。

Person.cs 下面:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indexer1
{
    public class Person
    {
        private string name;
        private string surname;
        private int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }


        public string Surname
        {
            get { return surname; }
            set { surname = value; }
        }


        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public override string ToString()
        {
            return string.Format("{0} {1} {2}", name, surname, age);
        }

        public Person(string name, string surname, int age)
        {
            this.name = name;
            this.surname = surname;
            this.age = age;

        }
    }
}

Indexer.cs 实例化 List<> 中的人员如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indexer1
{
    public class Indexer
    {
        List<Person> per = new List<Person>();

        public Indexer()
        {
            per.Add(new Person("Joe", "Soap", 25));
            per.Add(new Person("Marry", "Jane", 82));
            per.Add(new Person("Garry", "Zuma", 37));
            per.Add(new Person("Nelson", "Mabaso", 14));
        }

        public Person this[int indexes]
        {
            get
            {
                foreach (Person item in per)
                {
                    if (item.Age == indexes)
                    {
                        return item;
                    }
                    else
                    {
                        return null;
                    }
                }
                return null;
            }
            set
            {
                per[indexes] = value;
            }
        }
    }
}

Program.cs 实例化索引器以允许搜索和查找,下面:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Indexer1
{
    class Program
    {
        static void Main(string[] args)
        {
            Indexer ind = new Indexer();

            Console.WriteLine("enter in age of person you are searching for");
            int age = int.Parse(Console.ReadLine());

            Console.WriteLine();
            Console.WriteLine("{0} {1} {2}", ind[age].Name, ind[age].Surname, ind[age].Age);

            Console.ReadKey();
        }
    }
}

当我 运行 程序并根据 "Joe Soap" 搜索第一个添加到列表 <> 的人时,在出现提示时输入他的年龄:25,我能够成功找到他并且显示他的所有信息。

但是当我在 List<> per 中搜索任何其他人时,假设 "Garry Zuma" 输入他的年龄:37 出现提示时,程序失败并抛出异常:

Indexer1.exe 中发生类型 'System.NullReferenceException' 的未处理异常 附加信息:未将对象引用设置为对象的实例。

我已尝试搜索该异常,但找不到任何解决我问题的方法。

非常感谢你们的帮助和协助。

看看迭代过程。考虑在第一次迭代中,if (item.Age == indexes) 的计算结果为 false,然后该方法将 return null 传递给调用方法(其余迭代将被跳过)。所以你需要做的是,删除 else{..} 部分;因此,如果满足条件,该方法将 return Person 对象,否则将在迭代后 return null

public Person this[int indexes]
{
    get
    {
        bool isFound = false;
        foreach (Person item in per)
        {
            if (item.Age == indexes)
            {
                return item;
            }                   
        }
        return null;
    }
    set
    {
        per[indexes] = value;
    }
}

您需要从索引器中删除以下代码

else
{
   return null;
}

该代码防止循环越过列表中的第一项