无法将 [] 索引应用于“type”类型的表达式

heh*_*324 5 .net c# algorithm c#-5.0 .net-5

每个人!我是编程新手,希望得到您的帮助!我正在尝试返回数组的索引,但不知道错误是什么意思。我第一次得到这个。

这是我的第一堂课

using System;
using System.Linq;

public class Group
{
private Student[] students;

public Group(Student[] students)
{
    if(students.Length < 5)
    {
        throw new ArgumentException("Incorrect group");
    }

    this.students = students;
}

public int IndexOfMaxGrade()
{
    Student[] sorted = students.OrderBy(c => c.grade).ToArray();
    //int max = sorted[^1].grade;

    //foreach (var item in students)
    //{
    //    if(item.grade == max)
    //    {
            
    //    }
    //}

    return Array.IndexOf(students, sorted[^1].grade);
}

public int IndexOfMinGrade()
{
    Student[] sorted = students.OrderBy(c => c.grade).ToArray();

    return Array.IndexOf(students, sorted[0].grade);
}
}
Run Code Online (Sandbox Code Playgroud)

我在这段代码上得到了“无法将[]索引应用到'type'类型的表达式”(最后两行)

    Group studentGroup;

    try
    {
        studentGroup = new Group(students.ToArray());
    }
    catch (ArgumentException argumentException)
    {
        Console.WriteLine(argumentException.Message);
        return;
    }

    Console.WriteLine(studentGroup[studentGroup.IndexOfMinGrade()]);
    Console.WriteLine(studentGroup[studentGroup.IndexOfMaxGrade()]);
}
}
Run Code Online (Sandbox Code Playgroud)

Cai*_*ard 5

如果你想Group直接索引 a,你必须提供一个索引器:

public class Group
{
  public Student this[int i]{
    get { return students[i]; }
    set { students[i] = value; }
  }
  ...
Run Code Online (Sandbox Code Playgroud)

您会看到,您的小组有一个学生数组,但这并不意味着它本身可以像数组一样直接可索引。

当你这样做时:

Group studentGroup = ...
Run Code Online (Sandbox Code Playgroud)

您稍后尝试访问组内某个索引处的某些内容:

studentGroup[studentGroup.IndexOfMinGrade()];     //like this
studentGroup[1];                                  //or like this, for example
Run Code Online (Sandbox Code Playgroud)

C# 不会查看您的 Group 类型并认为“它内部只有一个数据项,即一个数组,因此我将允许某人在[1]Group 实例旁边放置一个索引说明符,然后我将检索内部数组中的项目“..

..它只是说“无法索引组”


如果您添加索引器,那就幸福了。你也可以这样做:

class Group{
  ...

  public Student GetStudentAt(int index){
    return students[index];
  }
Run Code Online (Sandbox Code Playgroud)

然后打电话:

  Console.WriteLine(studentGroup.GetStudentAt(studentGroup.IndexOfMinGrade()));
Run Code Online (Sandbox Code Playgroud)

概念上等同..