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;
}
该代码防止循环越过列表中的第一项
下面是一个包含三个 类 的非常基本的程序,它使用索引器根据年龄在 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;
}
该代码防止循环越过列表中的第一项