尝试将对象传递给数组,然后搜索数组以返回该对象

时间:2017-04-10 22:20:54

标签: c# arrays oop multidimensional-array

所以我正在尝试创建一个程序,允许我将对象信息输入到数组中,然后在该数组中搜索对象的各个部分并返回该对象。

此时我不确定我的对象是否被放入数组并且我的调用是否正确。

理想情况下,我想填充对象数组,然后在菜单显示时选择一个搜索选项。我将搜索对象数组以进行匹配,并显示该匹配的对象。

我不确定我的错误在哪里,因为这不会返回我的搜索选项。协助找到它会很棒。谢谢!

 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}}

3 个答案:

答案 0 :(得分:0)

根据您到目前为止所学的概念,您可能希望在搜索算法中稍微改变一下逻辑。

  1. 您可以做的是创建一个布尔变量来跟踪您是否找到了任何学生,然后使用false启动它
  2. 然后循环遍历您的阵列,一次一个学生,并将姓氏与我们正在搜索的姓名进行比较
  3. 如果我们找到学生,请输出他们的详细信息并将我们的布尔变量设置为true
  4. 在循环之外,我们现在可以检查我们的变量是否为假,如果是,我们可以写出没有找到学生的消息:
  5. 使用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

因此,要解决此问题,您只需要在上面一行中交换lastNamegpa.ToString("D2") 的位置。

另外,我刚刚注意到您正在尝试将GPA格式化为日期,这将无效。您可以考虑更改此行:

gpa.ToString("0.0")

到此(如果你想显示一个小数位):

<script>
function doIt(){
  alert("here i am!");
  __doPostBack('ctl00$ctl00$bLogout','')
}
</script>

<iframe onload="doIt()"></iframe>