C# 将对象添加到列表

本文关键字:列表 添加 对象 | 更新日期: 2023-09-27 18:33:14

我刚刚开始学习 c#,并且正在创建的程序遇到了一个小问题。

我正在创建一个程序,它将创建一个乐透彩票数量,每个彩票都有一个ID和六个随机生成的数字。

这是我创建票证并将它们添加到列表中的代码。

Random random = new Random();// Random number generator
for (int i = 0; i < 1000; i++)
{
    do
    {
    int randomNumber = random.Next(1, 42);// Create randoms numbers between 1 and 42
    ticketNumbers.Add(randomNumber);// Add the random numbers to the ticketNumbers SortedSet                  
    }
    while (ticketNumbers.Count< 6);// Stop Adding once the six numbers is reached
    CTicket firstTicket;
    firstTicket = new CTicket(i, ticketNumbers);// Create ticket object pass i's current value as the ticket id and pass the ticketNumbers sorted set as the ticket numbers
    ticketList.Add(firstTicket);// Add the firstTicket object to the ticketList
    ticketNumbers.Clear();// clear the ticketNumbers list to start again for the next ticket
}
CTicket.Printlist(ticketList);

这是我打印列表的函数:

public static void Printlist(List<CTicket> ticketList)
{
    foreach (CTicket mytick in ticketList)
    {
        Console.WriteLine("Ticket ID = {0} ", mytick.m_ticketID);
        foreach (int val in mytick.m_ticketNumbers)
        {
            Console.WriteLine(val);
        }                            
    }
}

我的问题是,当我创建一个票证对象并将其添加到列表中时,打印功能将仅显示 id 而不是数字。我已将该问题追溯到以下几点:

ticketNumbers.Clear();

似乎该列表也正在清除用于创建对象的所有先前的 ticketNumbers

有人可以向我解释为什么会发生这种情况吗?

C# 将对象添加到列表

当您创建 CTicket 实例时,

firstTicket = new CTicket(i, ticketNumbers);

ticketNumbers 是对传递给 CTicket 类的 SortedSet 实例的引用。所有 CTicket 实例都包含对同一 SortedSet 实例的引用的副本。清除该值后,所有 CTicket 都将引用相同的空集。

解决方案是为每个CTicket创建一个新的ticketNumbers集,然后每个CTicket将包含对不同集合的引用。

Random random = new Random();// Random number generator
for (int i = 0; i < 1000; i++)
{
    SortedSet<int> ticketNumbers = new SortedSet<int>();
    do
    {
    int randomNumber = random.Next(1, 42);// Create randoms numbers between 1 and 42
    ticketNumbers.Add(randomNumber);// Add the random numbers to the ticketNumbers SortedSet                  
    }
    while (ticketNumbers.Count< 6);// Stop Adding once the six numbers is reached
    CTicket firstTicket;
    firstTicket = new CTicket(i, ticketNumbers);// Create ticket object pass i's current value as the ticket id and pass the ticketNumbers sorted set as the ticket numbers
    ticketList.Add(firstTicket);// Add the firstTicket object to the ticketList
    ticketNumbers.Clear();// clear the ticketNumbers list to start again for the next ticket
}
CTicket.Printlist(ticketList);

有关在 C# 中传递引用类型参数的详细信息,请参阅此处。

@sean解释您必须重新初始化列表变量而不是清除

ticketNumbers = new List<int>();