0

これは for ループです。TicketList は 109 チケットから始まります。nColumns = 100. チケットの数に応じて、必要な行数を計算します。したがって、この場合、2行が必要です。行 1 がいっぱいになり、行 2 には 9 つのエントリしかありません。私は以下のループを持っています。NumOfRows に対して 1 回だけ実行され、最初の 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;は正しい行数を計算する必要があります。

Countまた、 Linq 拡張メソッドではなくのプロパティ バージョンを使用し、ではなくIList<T>.RemoveAt()orを使用する必要があります。List<T>.RemoveAtRemove(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 に答える