0

我有这个 for 循环。TicketList 以 109 张票开始。nColumns = 100。我根据票的数量计算我需要的行数。所以在这种情况下,我需要 2 行。第一行将已满,第二行将只有 9 个条目。我有下面的循环。它只为 NumOfRows 运行一次并填充前 100 个并且从不循环。

我错过了什么?

for (int j = 0; j < NumOfRows; j++)
  {
       for (int i = 0; i < nColumns; i++)
       {
           if (TicketList.Count() > 0)
           {
               t = rand.Next(0, TicketList.Count() - 1);
               numbers[i, j] = TicketList[t];
               TicketList.Remove(TicketList[t]);
           }
       }                
   }
4

2 回答 2

3

尝试更改您的代码以使用更类似于 LINQ 的功能性方法。如果可能会使逻辑更容易。像这样的东西:

TicketList
    .OrderBy(x => rand.Next())
    .Select((ticket, n) => new
    {
        ticket,
        j = n / NumOfRows,
        i = n % NumOfRows
    })
    .ToList()
    .ForEach(x =>
    {
        numbers[x.i, x.j] = x.ticket;
    });

您可能需要翻转x.i&x.j或使用nColumns而不是NumOfRows- 我不确定您的逻辑在寻找什么 - 但这段代码可能会更好。

于 2013-10-11T03:37:09.773 回答
1

除了一些糟糕的选择之外,您的循环似乎还不错。我敢说NumOfRows计算不正确。

该表达式NumOfRows = (TotalTickets + (Columns - 1)) / Columns;应计算正确的行数。

此外,您应该使用属性版本 ofCount而不是 Linq 扩展方法,并使用IList<T>.RemoveAt()orList<T>.RemoveAt而不是Remove(TicketList[T]).

使用Remove()要求枚举列表以定位要删除的元素,这可能与您的目标索引不同。更不用说当您已经知道要删除的正确索引时,您将为每个 Remove 调用扫描 50%(平均)的列表。

前面列出的函数式方法似乎有些矫枉过正。

我试图复制您的问题,假设有关使用的各种变量的某些事实。循环重复预期的次数。

    static void TestMe ()
    {
        List<object> TicketList = new List<object>();

        for (int index = 0; index < 109; index++)
            TicketList.Add(new object());

        var rand = new Random();
        int nColumns = 100;
        int NumOfRows = (TicketList.Count + (nColumns - 1)) / nColumns;
        object[,] numbers;
        int t;

        numbers = new object[nColumns, NumOfRows];

        for (int j = 0; j < NumOfRows; j++)
        {
            Console.WriteLine("OuterLoop");
            for (int i = 0; i < nColumns; i++)
            {
                if (TicketList.Count > 0)
                {
                    t = rand.Next(0, TicketList.Count - 1);
                    numbers[i, j] = TicketList[t];
                    TicketList.RemoveAt(t);
                }
            }
        }
    }

您看到的问题必须是您的样本中未包含的某些内容的结果。

于 2013-10-11T04:25:05.690 回答