下面是一个非常基本的程序,它有三个类,它们利用索引器搜索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中 附加信息:未将对象引用设置为对象的实例。
我已尝试搜索该异常,但我无法找到解决问题的任何内容。
你的帮助和帮助非常感谢。
答案 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;
}
}