#c# #arrays #methods
#c# #массивы #методы
Вопрос:
Существует класс для пассажиров, который содержит string name
, int age
string job
и т.д. Я создал массив этого класса, допустим, в нем 10 мест. Я хочу найти самого старого пассажира.
Мой код не работает, потому что невозможно сравнить passenger[i]
с целым числом. Я имею в виду, что мне нужно только age
в passenger[]
Как найти самое старое в passenger[]
?
РЕДАКТИРОВАТЬ: Возвращаемое значение должно быть a passenger
по his name
и major
, а не только его age
.
public Passenger Oldest()
{
int oldest = 0;
for (int i = 0; i < passengers.Length; i )
{
if (passengers[i] > oldest)
{
oldest = passengers[i];
}
}
return oldest;
}
class Passenger
{
int age;
string name;
string major;
public Passenger(int _age, string _name, string _major)
{
age = _age;
name = _name;
major = _major;
}
}
Комментарии:
1. использовать
passengers[i].age
дляoldest
сравнения?2. ^— Это плюс, обратите внимание, что
oldest
этоint
, но метод ожидает, что будет возвращен типPassenger
3.
age
,name
иmajor
являютсяprivate
. Вы не можете получить к ним доступ извне классаPassenger
Ответ №1:
Во-первых, как упоминал @Cid в комментарии к вопросу, все поля Passenger
являются private
(по умолчанию, когда модификатор не указан). Вам следует либо пометить их как public
(чтобы получить к ним доступ вне объявляющего класса), либо лучше создать общедоступные свойства:
class Passenger
{
public int Age { get; set; } // public auto property
public string Name { get; set; } // public auto property
public string Major { get; set; } // public auto property
public Passenger(int age, string name, string major)
{
Age = age;
Name = name;
Major = major;
}
}
Во-вторых, вам нужно сравнить Age
(часть, а не весь объект) пассажира:
if (passengers[i].Age > oldest)
{
oldest = passengers[i].Age;
}
Кроме того, вы могли бы использовать LINQ
для поиска самого старого пассажира:
var oldest = passengers.Max(item => item.Age);
Наконец, чтобы вернуть самого старого пассажира:
public Passenger Oldest()
{
// if no passengers -> return null
if (!passengers?.Any() ?? true)
{
return null;
}
var maxAge = passengers.Max(item => item.Age);
return passengers.First(item => item.Age == maxAge);
}
Кроме того, как упоминал @DmitryBychenko, метод может быть сокращен до:
public Passenger Oldest()
{
// if no passengers -> return null
if (!passengers?.Any() ?? true)
{
return null;
}
return passengers.Aggregate((s, a) => s.Age > a.Age ? s : a);
}
или без LINQ
:
public Passenger Oldest()
{
// if no passengers -> return null
if (passengers == null || passengers.Length == 0)
{
return null;
}
var maxAge = passengers[0].Age;
var oldestPassengerIndex = 0;
for (var i = 1; i < passengers.Length; i )
{
if (passengers[i].Age > maxAge)
{
oldest = passengers[i].Age;
oldestPassengerIndex = i;
}
}
return passengers[oldestPassengerIndex];
}
Комментарии:
1. Решение Linq может быть сокращено до
return passengers.Aggregate((s, a) => s.Age > a.Age ? s : a);
2. Без LInq метод также может быть сокращен, если мы превратим
for
цикл вforeach
один:Passender oldest = null; foreach (var p in passengers) if (oldest == null || p.Age > oldest.Age) oldest = p; return oldest;
Ответ №2:
Немного более эффективная версия ответа Романа, особенно если самый старый пассажир появляется последним в списке:
public Passenger Oldest()
{
if (passengers.Length == 1) return passengers[0];
var oldest = passengers[0];
for (int i = 1; i < passengers.Length; i )
{
if (passengers[i].Age > oldest.Age) oldest = passengers[i];
}
return oldest;
}
Для этого требуется всего одна итерация.
Ответ №3:
Использовать Linq просто
var oldest=passengers.Max(x=>x.Age):
В противном случае
Passenger oldest=new Passenger(0,"","");
foreach (Passenger p in Passengers){
if (p.age>oldest.age) oldest=p;
}