所以我正在尝试创建一个程序,允许我将对象信息输入到数组中,然后在该数组中搜索对象的各个部分并返回该对象。
此时我不确定我的对象是否被放入数组并且我的调用是否正确。
理想情况下,我想填充对象数组,然后在菜单显示时选择一个搜索选项。我将搜索对象数组以进行匹配,并显示该匹配的对象。
我不确定我的错误在哪里,因为这不会返回我的搜索选项。协助找到它会很棒。谢谢!
class School
{
private string lname;
private string fname;
private double gpa;
private string major;
private int id;
public School (string ln, string fn, string maj, int ident, double grade)
{
lname = ln;
fname = fn;
major = maj;
id = ident;
gpa = grade;
}
public string Lname
{
get
{
return lname;
}
set
{
lname = value;
}
}
public string Fname
{
get
{
return fname;
}
set
{
fname = value;
}
}
public string Major
{
get
{
return major;
}
set
{
major = value;
}
}
public override string ToString()
{
string student = lname + ", " + fname + "; " + id + " " + major + " " + gpa.ToString("D2");
return student;
}
static void FindLastName(params School [] findLName)
{
for (int i = 0; i < findLName.Length; i++)
{
WriteLine(findLName[i]);
}
// The above loop proves that the objects exist within the array after being passed to the method.
Write("What is the last name? ");
string findL = ReadLine();
School foundStudent = null;
for (int i = 0; i < findLName.Length; i++)
{
if (findLName[i].Lname == findL)
{
foundStudent = findLName[i];
break;
}
}
if (foundStudent != null)
{
PrintStudent(foundStudent);
}
else
{
Write("No results found with that last name {0}.", findL);
}
// When I run this it returns the else statement even though I am using a last name that exists within the array
UPDATE!:所以我已经确认我的数组正在填充我的对象,但是我想知道这些值是否正确地传递给我的方法。 目前尝试使用我的FindLastName()方法搜索对象数组只返回else语句,就好像数组中的值不存在一样。
更新2:在做出一些建议的更改之后,我大约80%确信我的错误在于此方法。
{{1}}
答案 0 :(得分:0)
根据您到目前为止所学的概念,您可能希望在搜索算法中稍微改变一下逻辑。
false
启动它true
。使用IndexOf
的原因并不像你想要的那样,你必须传递一个存储在数组中的类型的对象,它必须与数组中的一个完全匹配(该类的Compare
方法将返回true)。
...
static void FindLastName(params School[] findLName)
{
Write("What is the last name? ");
string findL = ReadLine();
// Create a variable to track if we find a match
bool foundStudent = false;
// Search through each array item
for (int i = 0; i < findLName.Length; i++)
{
// See if this item's last name is a match
if (findLName[i].LName == findL)
{
// If it is, set our variable to this student and break out of the for loop
PrintStudent(findLName[i]);
foundStudent = true;
}
}
// If our variable is false (or "not true" in the syntax here), we tell the user
if (!foundStudent)
{
Write("No results found with that last name {0}.", findL);
}
}
答案 1 :(得分:0)
您可以利用LINQ通过以下方式使搜索变得简单易用:
string searchValue = PutSearchValueInHere();
School[] selectedStudentArray = schoolArray.Where(school=>school.SearchField == searchValue).ToArray();
School selectedStudent = selectedStudentArray[0]; //Assuming you used a primary key as your search field
基本上这是如何工作的,你选择一个字段(可能是一个唯一的学生ID)和你的类的属性(例如.StudentID
)然后将其作为一个数组的扩展方法.Where
传递给lambda表达式。然后它将返回lambda评估为true
的任何项目。
表达式school=>school.SearchField == searchValue
实质上意味着&#34;搜索值是否等于此学校对象的SearchField,是/否?&#34;并且它会为数组中的每个项重复此操作。
接下来,.ToArray()
只是告诉它将结果存储为新数组。
完成此操作后,假设只有一名学生符合条件,您可以自由选择数组中的第一项。但是,可能值得检查一下是否为空。
作为一种思考,我真的无法帮助,但我觉得你应该将学生信息存储在SQL数据库中并通过ODBC链接访问它,但这完全不同。
答案 2 :(得分:0)
在我看来,您正在以错误的顺序将参数传递给lastName
,这最终会将此人的姓氏换成姓氏。那么之后,当你用姓氏搜索某人时,你永远不会得到一个匹配!
函数签名如下所示(static void GetInfo(out string lastn, out string firstn, out string mjr)
为FIRST参数):
lastName
但是你这样称呼它(以GetInfo(out firstName, out lastName, out major);
作为SECOND参数):
firstName
因此,要解决此问题,您只需要在上面一行中交换lastName
和gpa.ToString("D2")
的位置。
另外,我刚刚注意到您正在尝试将GPA格式化为日期,这将无效。您可以考虑更改此行:
gpa.ToString("0.0")
到此(如果你想显示一个小数位):
<script>
function doIt(){
alert("here i am!");
__doPostBack('ctl00$ctl00$bLogout','')
}
</script>
<iframe onload="doIt()"></iframe>