0

私は C# を学習している途中で、C# の構造に少し行き詰まっており、その中から最小値、最大値、平均値を見つけています。

私の構造は以下のように宣言されています。

    [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 内の Average englishGrade

ArrayList の順序付けを検討しましたが、firstName に基づいてデータを順序付けする必要があるため、その方法は使用できません。

誰かが私を正しい方向に向けることができますか? /助けを貸しますか?

4

3 に答える 3

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さらに、として宣言していることを考慮するとstruct、 への各挿入はArrayListボクシングを表します。高性能ではありません。

コードに次の編集を行います。

  • studentsクラスに変更し、名前を に変更しStudentます。サイズのフィールドのstruct合計が 16 バイトを超える場合は、通常、クラスを使用することをお勧めします。
  • に変更studentListList<Student>ます。
  • OfType冗長になる呼び出しを削除します。
于 2013-01-14T17:19:19.143 に答える
0

構造体の唯一の目的が個別のデータ項目の意味的に固定されたセットを保持または渡すことである場合は、透過的な構造体型 (すべてのパブリック フィールドを持つ型) を使用しても問題ありません。メソッドthisは、コンストラクターおよびプロパティの外部またはそのフィールドに書き込みませんセッターの場合、構造体の状態全体がパブリック フィールドにカプセル化されます。パブリック フィールドは、それぞれの型に有効な値の任意の組み合わせを正当に取り、構造体内のデフォルト値はそれぞれの型のデフォルト値と一致する必要があります。君のstudentstype はその基準をほぼ満たしていますが、完全ではありません。これは、学生の特性の恣意的な選択を表しているように思われ、学生に関する情報を必要とするすべての人が同じ情報を必要とすると信じる特別な理由がないからです。さらに、この設計では、各生徒が正確に 3 つの成績を持っているという事実を不必要にハードコーディングしているように見えます。場合によっては、そのような仮定が妥当です。たとえば、2 次元の点で動作するように設計されたコードは 3 次元の点では役に立たない可能性が高いため、透明な構造を使用して 2 次元の点の座標を保持しても問題ありません。何らかの目的で 3D ポイントが必要な場合、3D ポイントで動作するように設計されたコードでは動作しないため、単純に 3D ポイントを新しいタイプにすることができます。対照的に、それは'

于 2013-01-14T23:17:12.703 に答える
-1

を使用しないでくださいArrayList一般的な 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# の命名規則についても理解しておく必要があります。

于 2013-01-14T17:19:34.550 に答える