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 回答
0

给出的信息唯一可能的解释StringGenerator.GenerateShortLink是以“时间敏感”的方式实现的 - 例如,如果它在Random内部使用一个实例并在每次调用时重新创建它......在这种情况下,新创建的实例(默认情况下)使用当前系统时间进行初始化...带有断点它会延迟到足以产生不同的随机数...没有断点它会使用相同的数字初始化(因为没有足够的延迟)并因此产生相同的随机数反过来产生与shortUrl第一次产生的相同的随机数......因为这已经是字典的一部分,combinedUrlsList所以不会第二次添加......

修复上述行为:
不要在调用之间重新创建Random内部StringGenerator.GenerateShortLink使用的实例,而是在后续调用中重用已经创建的实例......

于 2013-05-06T17:25:43.973 回答