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

时间:2016-05-18 22:44:36

标签: c# indexer

下面是一个非常基本的程序,它有三个类,它们利用索引器搜索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实例化列表中的人员<>每个下面:

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

当我运行程序并搜索添加到列表中的第一个人&lt;&gt;每个&#34; Joe Soap&#34;通过进入他的年龄:25,当提示时,我能够成功找到他并显示他所有的信息。

但是一旦我搜索列表中的其他人&lt;&gt; per,let&#39;&#34; Garry Zuma&#34;通过输入他的年龄:37提示时,程序失败并抛出异常:

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

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

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

2 个答案:

答案 0 :(得分:3)

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

else
{
   return null;
}

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

答案 1 :(得分:2)

查看迭代过程。请注意,在第一次迭代中,if (item.Age == indexes)的计算结果为false,然后该方法将null返回到调用方法(其余的迭代项跳过)。所以你需要做的是,删除else{..}部分;因此,如果方法满足条件,则该方法将返回Person对象,否则将在迭代后返回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;
    }
}