Реализуйте список со студентами и определите кто из них будет отчислен 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 шт):
В Вашем случае, если не прибегать к изменению класса 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();