найдите наибольшее число в массиве, созданном методом

#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;
}