1

我需要将一堆项目添加到数据结构中,然后以随机顺序访问其中的所有项目。我怎样才能做到这一点?

更具体地说,我目前正在向List<string>对象添加 URL。它们的添加方式使得相邻的 URL 可能位于同一服务器上。当我使用 Parallel.ForEach 语句访问列表时,它只是按照我添加它们的顺序返回项目。通常这没问题,但是当我并行发出 Web 请求时,这往往会使某些服务器不堪重负并导致超时。当我在对象上运行 Parallel.ForEach 语句时(即,不是按照我添加它们的顺序),我可以使用什么数据结构以更随机的方式返回项目?

4

2 回答 2

1

原始解决方案

费舍尔-耶茨洗牌

public static void Shuffle<T>(this IList<T> list)  
{  
    Random rng = new Random();  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}

List<Product> products = GetProducts();
products.Shuffle();
于 2013-05-13T23:38:28.890 回答
1

我认为改组是一个更好的答案,但是对您的具体问题的答案将是Hashtable。您将添加您的字符串 url 作为键和 null 作为值。Keys 属性将按照它们碰巧放置在哈希表中的顺序返回字符串,这将是相当随机的,因为字符串的哈希码和冲突处理将导致顺序与字符串的排序顺序没有很好的相关性重视自己。

Dictionary 和 HashSet 的工作方式不同。他们的内部实现最终按照添加的顺序返回项目。

尽管这就是 Hashtable 的实际工作方式,但您会指望内部实现细节,这有其潜在的危险。这就是为什么我更喜欢洗牌。

于 2013-05-14T00:13:04.127 回答