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

C# 我可以使用什么数据结构随机访问其内容?,c#,data-structures,random,C#,Data Structures,Random,我需要向数据结构中添加一组项,然后以随机顺序访问其中的所有项。我该怎么做 更具体地说,我目前正在向列表对象添加URL。它们的添加方式使相邻URL可能位于同一服务器上。当我使用Parallel.ForEach语句访问列表时,它只是按照我添加项目的顺序返回项目。通常这是可以的,但当我并行发出web请求时,这往往会使一些服务器无法正常工作,并导致超时。当我在对象上运行Parallel.ForEach语句时,我可以使用什么样的数据结构以更随机的方式返回项(即,不是按照我添加它们的顺序)? public

我需要向数据结构中添加一组项,然后以随机顺序访问其中的所有项。我该怎么做

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

publicstaticvoidshuffle(此IList列表)
{  
随机rng=新随机();
int n=list.Count;
而(n>1){
n--;
int k=下一个(n+1);
T值=列表[k];
列表[k]=列表[n];
列表[n]=值;
}  
}
List products=GetProducts();
products.Shuffle();

我认为洗牌是一个更好的答案,但对于您的具体问题,答案应该是一个。您可以添加字符串url作为键,null作为值。Keys属性将按照字符串在哈希表中的位置顺序返回字符串,这将是相当随机的,因为字符串的哈希代码和冲突处理将导致该顺序与字符串值本身的排序顺序没有很好的相关性

字典和哈希集的工作方式不同。它们的内部实现最终按照添加的顺序返回项目


虽然哈希表实际上就是这样工作的,但您需要依赖内部实现细节,这有其潜在的危险。这就是为什么我更喜欢洗牌。

添加完所有项目后,可能只是列表?随机真的是你想要的吗?或者您希望有一个服务器列表,每个服务器都有一个URL列表,然后在服务器上运行Parallel.ForEach,但不在URL上运行?我已经编辑了您的标题。请看,“,其中的共识是“不,他们不应该”。伙计,如果你要逐字复制另一个答案的代码,至少!那么,HashSet是由LinkedHashSet实现的?这很好,而且似乎不是文档的一部分。@ILMTitan-Dictionary&HashSet是使用指向单链表的封闭寻址散列桶实现的。所有链表都在一个数组中,该数组的元素按需要的顺序提供。枚举数对该数组进行枚举。因此,最终的结果是,您按照添加的顺序返回内容(假设您没有删除任何内容)。
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();