簡體   English   中英

每次調用方法時在方法中向數組添加值

[英]adding values to an array in a method every time you call the method

我有一個名為乘客的數組,假設它有 10 個位置。 我還有一個 class 供新乘客使用,它會有乘客的年齡。 我想按他的年齡將新乘客添加到數組中。 該乘客將由其 class 通過調用構造函數創建。 假設我通過調用該方法只添加了一名乘客,並且 9 個地方是空的。 下一次調用該方法,我想在乘客數組的下一個位置添加一個新乘客,所以每次我想添加一個新乘客時,我都會調用乘客方法,它將保存在下一個空放在數組中。 直到滿為止。 一條消息會說它已滿,沒有乘客可以打開 go。

我的代碼問題是我必須一次輸入所有乘客。 但我每次調用該方法時只想輸入一名乘客。

public void Add_Passengers ()
    {
        Console.WriteLine("How old are the passengers?");

        for (int i = 0; i < passengers.Length; i++)
        {
            int age = Int32.Parse(Console.ReadLine());
            passengers[i] = new Passenger(age);
        }
    }
    /// <summary>
    /// Passengers array
    /// </summary>
    public Passenger[] Passengers = new Passenger[10];

    public class Passenger
    {
        public int Age { get; set; }

        public Passenger(int age)
        {
            Age = age;
        }
    }

    public void AddPassenger()
    {
        // Get the number of passengers
        int passengerCount = Passengers.Count(p => p != null);

        if (passengerCount == Passengers.Length)
            Console.WriteLine("Maximum number of passengers");
        else
        {
            Console.WriteLine("How old are the passengers?");
            int age = int.Parse(Console.ReadLine());

            // Add passenger
            Passengers[passengerCount] = new Passenger(age);
        }
    }

你可以試試:

    public void AddPassengers(Passenger[] passengers)
    {
        int i = Array.IndexOf(passengers, null);

        if (i < 0)
        {
            Console.WriteLine("The array is full.");
            return;
        }

        Console.WriteLine("How old is the passenger?");

        int age = Int32.Parse(Console.ReadLine());
        passengers[i] = new Passenger(age);
    }

希望這可以幫助。

public void Add_Passengers()
    {
        PassengerClass PassengerClass = new PassengerClass();

        Console.WriteLine("How old are the passengers?");

        PassengerClass.AddPassanger(Int32.Parse(Console.ReadLine()));
    }

    public class PassengerClass
    {
        public List<int> passangerList;
        public PassengerClass()
        {
            if (passangerList == null)
                passangerList = new List<int>();
        }

        public void AddPassanger(int age)
        {
            passangerList.Add(age);
        }
    }

我將 go 與 class 解決方案:

public class Passanger {
        public int age;

        public Passanger(int age)
        {
            this.age = age;
        }
    }

    public class Passangers
    {
        private List<Passanger> passangers;
        private int limit;
        public bool ready { get; private set; }

        public Passangers(int capacity)
        {
            passangers = new List<Passanger>(capacity);
            limit = capacity;
            ready = false;
        }

        public void addPassanger(Passanger passanger)
        {
            passangers.Add(passanger);

            if(passangers.Count == limit)
            {
                ready = true;
            }
        }

        public List<Passanger> getPassangers()
        {
            passangers.Sort((p1, p2) => p1.age.CompareTo(p2.age));
            return passangers;
        }
    }

您可以保留一個額外的字段來跟蹤索引並在添加操作中遞增它,而不是每次都迭代數組。

private Passenger[] passengers = new Passenger[10];
private int _count = 0;
public void Add_Passengers()
{
    // validate overflow. >= not strictly necessary but a better safeguard than ==
    if (_count >= passengers.Length)
       throw new InvalidOperationException("Array is filled");
    
    Console.WriteLine("How old are the passengers?");
    
    // validate input
    if (!int.TryParse(Console.ReadLine(), out int age)) 
      throw new InvalidOperationException("Not an integer");

    // Postfix increment returns original value 
    passengers[_count++] = new Passenger(age);
    
}

顯然,您應該按照您認為合適的方式處理錯誤情況。 為了演示,我只是拋出一個InvalidOperationException

編輯:我剛剛注意到您明確要求顯示錯誤消息。 這可能看起來像這樣:

private Passenger[] passengers = new Passenger[10];
private int _count = 0;
public void Add_Passengers()
{
    // validate overflow. >= not strictly necessary but a better safeguard than ==
    if (_count >= passengers.Length)
    {
       Console.WriteLine("Error: No more passengers are allowed. Size limit reached.");
       return;
    } 
    
    Console.WriteLine("How old are the passengers?");
    
    // validate input
    if (!int.TryParse(Console.ReadLine(), out int age)) 
    {
       Console.WriteLine("Error: Value is not an integer");
       return;
    } 

    // Postfix increment returns original value 
    passengers[_count++] = new Passenger(age);
    
}

List<Passenger>可能是更好的選擇。 然后你不需要跟蹤索引或擔心大小溢出。 請注意,這兩種解決方案都不是線程安全的,但這是一個不同的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM