c# Struct/ArrayList和最小/最大/平均值

本文关键字:最大 平均值 Struct ArrayList | 更新日期: 2023-09-27 17:52:52

我在学习c#的过程中,我有点卡在c#结构和查找最小值,最大值和平均值里面。

My Structure声明如下;

    [Serializable]
    private struct students
    {   // Constructor Fills with default values
        public students(int x)
        {
            studentImage = " ";
            enrollmentDate = " ";
            firstName = " ";
            surname = " ";;
            englishGrade = 0;
            scienceGrade = 0;
            mathGrade = 0;
        }
        // Data types to be used in the Structure
        public string studentImage, enrollmentDate, firstName, surname;
        public int englishGrade, scienceGrade, mathGrade;
    }
   private ArrayList studentList; //This is used to work with the data

在结构中列出了多个学生及其学科成绩。我希望通过"记录"循环并获得以下内容;

    结构/数组列表中的最低英语等级
  • Structure/ArrayList中的最大英语等级
  • Structure/ArrayList内部的平均英语成绩

我已经研究了数组列表的排序,但我不能使用这种方式,因为我需要根据firstName对数据排序。

谁能给我指个正确的方向?/帮帮忙?

c# Struct/ArrayList和最小/最大/平均值

假设您真的想使用ArrayList:

studentList = new ArrayList();
//Fill data
var maxEnglish = studentList.
    OfType<students>().
    Max(student => student.englishGrade);
var minEnglish = studentList.
    OfType<students>().
    Min(student => student.englishGrade);
var avgEnglish = studentList.
    OfType<students>().
    Average(student => student.englishGrade);

添加到您的using指令后:

using System.Linq;

但是为什么不使用泛型的列表,比如List<students>呢?它将使您的代码更具可读性和效率。此外,考虑到将students声明为struct, ArrayList中的每次插入都表示装箱。这不是性能。

我会对你的代码做以下编辑:

  • students更改为类,并将其重命名为Student。如果struct大小的字段加起来超过16字节,通常最好使用类。
  • studentList更改为List<Student>
  • 删除对OfType的冗余调用。

使用透明结构类型(具有所有公共字段的结构类型)是可以的,如果结构的唯一目的是保存或传递一组语义固定的离散数据项,则没有方法写入this或其构造函数和属性设置器之外的字段,结构的整个状态被封装在公共字段中,可以合法地采用任何值的组合,这将对其各自的类型有效。其在结构体中的默认值应该与其各自类型中的默认值相匹配。你的students类型几乎符合这个标准,但不完全符合,因为它似乎代表了对学生特征的任意选择,没有特别的理由相信每个需要学生信息的人都会需要相同的信息。此外,这种设计似乎没有必要硬编码每个学生正好有三个年级的事实。在某些情况下,这种假设是合理的。例如,由于设计用于处理二维点的代码可能对三维点无用,因此使用透明结构来保存二维点的坐标是很好的。如果某种目的需要3d点,那么设计用于处理3d点的代码将无法处理它,因此可以简单地将3d点设置为新类型。相比之下,有理由认为将来可能会有第四种等级,如果添加了第四种等级,代码就可以"正常工作",这是可取的,但是当使用结构体时,实际上没有任何好的方法来实现这一点。

不要使用ArrayList。看看泛型列表。

private List<students> studentList;

用法:

var studentWithMaxGrade = studentList.Max(student => student.englishGrade);
var studentWithMinGrade = studentList.Min(student => student.englishGrade);
var averageGrade = studentList.Average(student => student.englishGrade);

你可能还想让自己熟悉c#的命名约定