C#Struct / ArrayList和min / max / average值

时间:2013-01-14 17:15:39

标签: c# struct arraylist

我正在学习C#,我对C#Structures有点困惑,并从中找到最小值,最大值和平均值。

我的结构声明如下;

    [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中的最小englishGrade
  • Structure / ArrayList中的最大englishGrade
  • Structure / ArrayList
  • 中的平均englishGrade

我已经研究过对ArrayList的排序,但我不能使用这种方式,因为我需要根据firstName对数据进行排序。

有人能指出我正确的方向吗? /借助帮助?

3 个答案:

答案 0 :(得分:2)

假设您确实想使用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声明为structArrayList中的每个插入都代表拳击。这不符合要求。

我会对您的代码进行以下编辑:

  • students更改为某个班级,并将其重命名为Student。如果struct大小的字段总和超过16个字节,那么使用类通常会更好。
  • studentList更改为List<Student>
  • 删除对OfType的调用,这将是多余的。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

不要使用ArrayList。看看generic Lists

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# naming conventions