Реализуйте список со студентами и определите кто из них будет отчислен c#

Задание: Есть массив\лист в котором есть несколько типов информации "Фамилия, Имя, Код Группы, Оценки(5 предметов)". Информация вбивать можно самому.

В чём смысл. Нужно каким то магическим образом перебрать эту "таблицу" и понять, у кого из учеников оценок "2" больше трёх. То есть, если у ученика три двойки - отчислен. Не понимаю как перебрать список. Вот что у меня есть:

public class Part : IEquatable<Part>
        {
            public string PartName { get; set; }

            public int PartId { get; set; }

            public string PartSurname { get; set; }

            public int PartMarks { get; set; }

            public override string ToString()
            {
                return "Фамилия: " + PartSurname + "     Имя: " + PartSurname + "    Код группы: " + PartId + "      Оценки:" + PartMarks;
            }
            public override bool Equals(object obj)
            {
                if (obj == null) return false;
                Part objAsPart = obj as Part;
                if (objAsPart == null) return false;
                else return Equals(objAsPart);
            }
            public override int GetHashCode()
            {
                return PartId;
            }
            public bool Equals(Part other)
            {
                if (other == null) return false;
                return (this.PartId.Equals(other.PartId));
            }

            public static void Main(string[] args)
            {

                List<Part> parts = new List<Part>();

                parts.Add(new Part() { PartSurname = "Kikchibek", PartName = "Yarmolat", PartId = 1234, PartMarks = 55522 });
                parts.Add(new Part() { PartSurname = "Kikchibek2", PartName = "Yarmolat2", PartId = 1235, PartMarks = 42222 });
                parts.Add(new Part() { PartSurname = "Kikchibek3", PartName = "Yarmolat3", PartId = 1236, PartMarks = 33322 });
                parts.Add(new Part() { PartSurname = "Kikchibek4", PartName = "Yarmolat4", PartId = 1237, PartMarks = 35322 });
                parts.Add(new Part() { PartSurname = "Kikchibek5", PartName = "Yarmolat5", PartId = 1238, PartMarks = 55555 });

                Console.WriteLine();
                foreach (Part aPart in parts)
                {
                    Console.WriteLine(aPart);
                }

                Console.ReadKey();
}
}
}

Помогите пожалуйста


Ответы (1 шт):

Автор решения: funforlifefix

В Вашем случае, если не прибегать к изменению класса Part то вариант решения - поиск через регулярное выражение средствами LINQ:

List<Part> unpart = parts.Where(x => Regex.IsMatch(x.PartMarks.ToString(), "[2]{3}")).ToList();

Производим поиск среди оценок, где имеется 3 двойки и все значение передаем в новый список.

А вообще как подметили в комментариях, правильно действительно было бы сменить public int PartMarks { get; set; } на public int[] PartMarks { get; set; } и заполнять уже оценки массивом, а не строчными данными.

Тогда решение было бы такое:

    parts.Add(new Part() { PartSurname = "Kikchibek", PartName = "Yarmolat", PartId = 1234, PartMarks = new int[] { 5, 5, 5, 2, 2 } });
    parts.Add(new Part() { PartSurname = "Kikchibek2", PartName = "Yarmolat2", PartId = 1235, PartMarks = new int[] { 4, 2, 2, 2, 2 } });
    parts.Add(new Part() { PartSurname = "Kikchibek3", PartName = "Yarmolat3", PartId = 1236, PartMarks = new int[] { 3, 3, 3, 2, 2 } });
    parts.Add(new Part() { PartSurname = "Kikchibek4", PartName = "Yarmolat4", PartId = 1237, PartMarks = new int[] { 3, 5, 3, 2, 2 } });
    parts.Add(new Part() { PartSurname = "Kikchibek5", PartName = "Yarmolat5", PartId = 1238, PartMarks = new int[] { 5, 5, 5, 5, 5 } });

    List<Part> unpart = parts.Where(x => x.PartMarks.Count(y => y == 2) >= 3).ToList();
→ Ссылка