我可以使用什么数据结构随机访问其内容?

时间:2013-05-13 23:32:01

标签: c# data-structures random

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

更具体地说,我目前正在向List<string>对象添加网址。它们的添加方式使得相邻的URL可能位于同一服务器上。当我使用Parallel.ForEach语句访问List时,它只返回我添加它们的顺序中的项目。通常情况下这是可以的,但是当我并行处理Web请求时,这往往会压倒一些服务器并导致超时。当我在对象上运行Parallel.ForEach语句时(即,不按我添加的顺序),我可以使用哪种数据结构以更随机的方式返回项目?

2 个答案:

答案 0 :(得分:1)

ORIGINAL SOLUTION

Fisher–Yates shuffle

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();

答案 1 :(得分:1)

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

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

虽然这就是Hashtable实际工作的方式,但你会指望一个内部实现细节,它有潜在的危险。这就是我喜欢洗牌的原因。