0

質問のタイトルが少し変だったらごめんなさい。3 つの列で構成される複合主キーを使用して 500 行の Excel を作成したいと考えています。2 つの列は 1 から 50 までのランダムな int を自動的に生成し、3 番目は 01.01.2006 から 31.12.2013 までの日付です。だから私は3つの異なる組み合わせを持つ500行を持ちたい.これが私のコードです

        Type excelType = Type.GetTypeFromProgID("Excel.Application");

        dynamic excel = Activator.CreateInstance(excelType);
        excel.visible = true;

        excel.Workbooks.Add();

        Random rnd = new Random();

        dynamic sheet = excel.ActiveSheet;

        for (int i = 1; i <= 500; i++)
        {


            sheet.Cells[i, "A"] = rnd.Next(1,50);
            sheet.Cells[i, "B"] = rnd.Next(1,50);
            sheet.Cells[i, "C"] = RandomDay();

//ここで、組み合わせが存在するかどうか、新しい組み合わせが割り当てられているかどうかを確認します

            for (int j = 0; j <= i + 1; j++)
            {
               if ( sheet.Cells[j + 1, "A"] == sheet.Cells[i, "A"] && 
                sheet.Cells[j + 1, "B"] == sheet.Cells[i, "B"] && 
                sheet.Cells[j + 1, "C"] == sheet.Cells[i, "C"])
                {
                    sheet.Cells[i, "A"] = rnd.Next(1,50);
                    sheet.Cells[i, "B"] = rnd.Next(1,50);
                    sheet.Cells[i, "C"] = RandomDay();

                }

            }

        }



    }

// ランダム日付メソッド

    public static DateTime RandomDay()
    {
        DateTime start = new DateTime(2006, 1, 1);
        DateTime end = new DateTime(2013, 12, 31);

        Random gen = new Random();

        int range = (end - start).Days;
        return start.AddDays(gen.Next(range));
    }

これが機能するかどうかは本当にわかりません。また、実行速度が遅いため、組み合わせが存在するかどうかを確認するために何度も繰り返す必要があります。誰もがより良い、より速い解決策を持っていますか? 皆さん、ありがとうございました!

4

1 に答える 1

1

制約で許可されている場合は、Excel の外部で一意の値を生成してから Excel に挿入することをお勧めします。これにより、それらをタプルの辞書に入れることができます。

そうすれば、値から文字列を作成し、それを辞書のキーとして使用することで、既存の値を確認できます。次に、辞書の値を繰り返し処理し、それらを Excel に挿入します。

HashTables (ディクショナリとは何か) はルックアップに一定の時間を必要とするため、一意性を保証するための時間を大幅に節約できます。

Dictionary<String,Tuple<int,int,DateTime>> store = new Dictionary<String, Tuple<int, int, DateTime>>();

for (int i = 0; i < 500; i++)
{
    int n1 = rnd.Next(1,50);
    int n2 = rnd.Next(1,50);
    DateTime dt = RandomDay();

   String key = n1.ToString() + n2.ToString() + dt.ToString();

    while (store.ContainsKey(key)) {
        n1 = rnd.Next(1,50);
        n2 = rnd.Next(1,50);
        dt = RandomDay();

        key = n1.ToString() + n2.ToString() + dt.ToString();
    }

    store.Add(key, new Tuple(n1, n2, dt));
}

そして、Excel に追加するには、store.Values を反復するだけです。

于 2013-05-19T20:43:33.763 に答える