2

我们被要求创建一个程序,它为飞机上的座位和乘客提供 2 个输入(我已经解析过),并在一个输出中随机地将乘客放在飞机上的座位上,并将剩余的座位放在辅助输出中。

我想知道是否有一种简单的方法可以将 , 中的剩余值替换HashSetlistBoxLedige.

正如它现在工作的那样,席位正在分配,但辅助输出中的值与第一个输出无关。

if(passengers > seats)
{
    MessageBox.Show("For mange passagerer");
}
else
{
    HashSet<int> check = new HashSet<int>();
    for(int i = 0; i <= passengers - 1; i++)
    {
        int resultat = rnd.Next(1, seats + 1);
        while(check.Contains(resultat))
        {
            resultat = rnd.Next(1, seats + 1);
        }
        check.Add(resultat);
        int[] passagerer01 = new int[passengers];
        passagerer01[i] = i+1;
        listBoxFulde.Items.Add("Passager #" + passagerer01[i] + "på sæde #" + resultat);
    }
    HashSet<int> ledige01 = new HashSet<int>();
    for(int i = 0; i <= (seats - passengers - 1); i++)
    {
        int tilbage = rnd.Next(1, seats + 1);
        while(ledige01.Contains(tilbage))
        {
            ledige01.Add(tilbage);
        }
        listBoxLedige.Items.Add("Sæde #" + tilbage);
4

3 回答 3

2

我不确定我是否理解您的问题,但是您是否看过ExceptLINQ 扩展方法?从您的措辞(“剩余价值”)来看,这可能是适合您的方法。

编辑这是如何完成的:

 IEnumerable<int> empty = allSeats.Except(check);

注意empty现在是一个延迟的枚举器(除非你做了一个.ToArray(),.ToList()或类似的)。

于 2013-09-26T22:20:01.963 回答
1

这是我要做的(见RangeExceptWith):

HashSet<int> ledige01 = new HashSet<int>(
    Enumerable.Range(1, seats));

ledige01.ExceptWith(taken);

请注意,在生成种子时,您可以通过简单地改变座位并获取第一个 N 来消除反复试验:

var taken = HashSet<int>(Enumerable.Range(1,seats).Shuffle().Take(passengers));

有关如何进行 shuffle 的提示,请参阅例如Optimal LINQ query to get a random sub collection - Shuffle


作为旁白:

    int[] passagerer01 = new int[passengers];
    passagerer01[i] = i+1;
    listBoxFulde.Items.Add("Passager #" + passagerer01[i] + "på sæde #" + resultat);

看起来不是你需要的东西:)但我假设它还没有完成,你可能已经意识到了

一个“完全”编辑的镜头:

if(passengers > seats)
{
    MessageBox.Show("For mange passagerer");
}
else
{
    HashSet<int> taken = new HashSet<int>();
    for(int i = 0; i <= passengers - 1; i++)
    {
        int resultat;
        do {
            resultat = rnd.Next(1, seats + 1);
        } while(taken.Contains(resultat));

        taken.Add(resultat);

        listBoxFulde.Items.Add("Passager #" + (i+1) + "på sæde #" + resultat);
    }

    HashSet<int> ledige01 = new HashSet<int>(
        Enumerable.Range(1, seats));

    ledige01.ExceptWith(taken);

if(passengers > seats)
{
    MessageBox.Show("For mange passagerer");
}
else
{
    HashSet<int> taken = new HashSet<int>();
    for(int i = 0; i <= passengers - 1; i++)
    {
        int resultat;
        do {
            resultat = rnd.Next(1, seats + 1);
        } while(taken.Contains(resultat));

        taken.Add(resultat);

        listBoxFulde.Items.Add("Passager #" + (i+1) + "på sæde #" + resultat);
    }

    HashSet<int> ledige01 = new HashSet<int>(Enumerable.Range(1, seats));

    ledige01.ExceptWith(taken);

    foreach(var tilbage in ledige01)
        listBoxLedige.Items.Add("Sæde #" + tilbage);
于 2013-09-26T22:21:33.463 回答
0

不是百分百确定我理解您的问题或解决方案,但您是否知道您passagerer01为每位乘客声明和初始化一次,然后确定性(非随机)i+1为乘客分配座位i,然后丢弃该数组?如果要保留信息,则必须在for循环外声明数组。

此外,您在代码的第二部分中似乎并没有做任何有意义的事情。要确定空座位,可以通过数字 1 到passengers,检查它们是否在集合中check,如果没有,将它们添加到集合ledige01中。或者,当然,使用 sehe 建议的库方法做一些等效的事情。

最后一点,在计算机科学中,您通常从零开始计数。因此,您通常会有座位号0seats-1随机选择座位,如下所示rnd.Next(0, seats):你通常会像这样循环:for(int i = 0; i < passengers; i++)而不是for(int i = 0; i <= passengers - 1; i++).

于 2013-09-26T22:42:06.043 回答