C#将对象添加到列表

C#将对象添加到列表,c#,list,sortedset,C#,List,Sortedset,我刚开始学习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 n

我刚开始学习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);
似乎也正在清除列表中用于创建对象的所有以前的票号


有人能解释一下为什么会发生这种情况吗?

当您创建CTicket实例时

firstTicket = new CTicket(i, ticketNumbers);
TicketNumber是对正在传递给CTicket类的SortedSet实例的引用。所有CTicket实例都包含对同一SortedSet实例的引用副本。清除该选项后,所有CTicket将引用相同的空集

解决方案是为每个CTicket创建一个新的ticketNumber集合,然后每个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);
Random Random=new Random();//随机数发生器
对于(int i=0;i<1000;i++)
{
SortedSet TicketNumber=新的SortedSet();
做
{
int randomNumber=random.Next(1,42);//创建介于1和42之间的随机数
ticketNumbers.Add(randomNumber);//将随机数添加到ticketNumbers SortedSet
}
while(ticketNumbers.Count<6);//一旦达到六个数字,就停止添加
CTicket第一票;
firstTicket=new-CTicket(i,ticketNumbers);//创建ticket对象,将i的当前值作为票证id传递,并将已排序的票证编号作为票证编号传递
ticketList.Add(firstTicket);//将firstTicket对象添加到ticketList
ticketNumbers.Clear();//清除ticketNumbers列表以重新开始下一张票证
}
CTicket.打印列表(票证列表);

有关更多信息,请参见此处。

创建CTicket实例时

firstTicket = new CTicket(i, ticketNumbers);
TicketNumber是对正在传递给CTicket类的SortedSet实例的引用。所有CTicket实例都包含对同一SortedSet实例的引用副本。清除该选项后,所有CTicket将引用相同的空集

解决方案是为每个CTicket创建一个新的ticketNumber集合,然后每个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);
Random Random=new Random();//随机数发生器
对于(int i=0;i<1000;i++)
{
SortedSet TicketNumber=新的SortedSet();
做
{
int randomNumber=random.Next(1,42);//创建介于1和42之间的随机数
ticketNumbers.Add(randomNumber);//将随机数添加到ticketNumbers SortedSet
}
while(ticketNumbers.Count<6);//一旦达到六个数字,就停止添加
CTicket第一票;
firstTicket=new-CTicket(i,ticketNumbers);//创建ticket对象,将i的当前值作为票证id传递,并将已排序的票证编号作为票证编号传递
ticketList.Add(firstTicket);//将firstTicket对象添加到ticketList
ticketNumbers.Clear();//清除ticketNumbers列表以重新开始下一张票证
}
CTicket.打印列表(票证列表);

更多信息请参见此处。

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

ticketNumbers = new List<int>();
ticketNumbers=newlist();

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

ticketNumbers = new List<int>();
ticketNumbers=newlist();

非常感谢您的解释。我来自C++,所以我不习惯使用引用而不使用.&实际上它是通过值传递的,但是TigKeType是对SORTED集的引用,所以您正在通过值传递引用。我对答案进行了编辑,以明确这一点。只是对原始主题的观察,但如果您希望42是一个可以随机创建的数字,则需要在随机中将42更改为43。下一步,因为上限是唯一的。非常感谢您的解释。我来自C++,所以我不习惯使用引用而不使用.&实际上它是通过值传递的,但是TigKeType是对SORTED集的引用,所以您正在通过值传递引用。我对答案进行了编辑,以明确这一点。这只是对原始主题的观察,但如果您希望42是一个可以随机创建的数字,则需要在随机中将42更改为43。下一步,因为上限是排他性的。这与您的问题没有多大关系,但我怀疑您的票证生成器逻辑中仍然存在缺陷。我想这是彩票式的六部分号码。这些票中很可能有一些包含重复的号码。您可能想重新访问您的号码生成器,以确保在每张票证中生成6个唯一的号码……这与您的问题没有多大关系,但我怀疑您的票证生成器逻辑中仍然存在缺陷。我想这是彩票式的六部分号码。这些票中很可能有一些包含重复的号码。您可能需要重新访问您的号码生成器,以确保在每张票证中生成6个唯一的号码。。。