0

以下のコードで奇妙な問題が発生しています。while ループからブレークポイントを除外すると、結果が異なります。

foreach ループは、リストから 20 項目をループし、各項目を辞書に追加します。

ループにブレークポイントを追加して 20 回スキップすると、20 個のアイテムが追加されます。

すべてのブレークポイントを削除してプログラムを実行すると、アイテムが 1 つだけ追加されます。

public void AddLinks(Dictionary<Guid,string> RowKeyTitles)
{
    var combinedUrlsList = new Dictionary<string, string>();

    var urlTemplate = ConfigurationManager.AppSettings["playlisturl"];
    var count = 0;

    foreach (var row in RowKeyTitles)
    {
        var shortUrl = StringGenerator.GenerateShortLink(4);
        var combinedUrl = urlTemplate.Replace("{name}", row.Value).Replace("{id}",row.Key.ToString());

        while (!combinedUrlsList.ContainsKey(shortUrl))
        {
            Console.WriteLine("test");

            shortUrl = StringGenerator.GenerateShortLink(4);

            if (!combinedUrlsList.ContainsKey(shortUrl))
            {
                count++; 
                Console.WriteLine("Added{0}", count);
                combinedUrlsList.Add(shortUrl, combinedUrl);

            }
        }              
    }

    Console.WriteLine("Count{0}",combinedUrlsList.Count());
    Console.ReadLine();
}

この動作の原因を知っている人はいますか?

4

2 に答える 2

2

推測して、タイトなループでStringGenerator.GenerateShortLink(4);同じことを生成すると言います。shortUrlこれはおそらく、Randomループ内で新しいクラスを作成しているためです。

壊れたコードの例

while(.....)
{
    Random rnd = new Random();
    rnd.Next();
}

システム時間をシードとして使用するため、これは多くのsame数値を生成します。Random()

修正します。Randomクラスのプライベート フィールドとして宣言し、一度だけ作成します。

于 2013-05-06T17:21:58.703 に答える