[英]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.