Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
随机顺序总体的最佳C#数据结构?_C#_Data Structures_Collections - Fatal编程技术网

随机顺序总体的最佳C#数据结构?

随机顺序总体的最佳C#数据结构?,c#,data-structures,collections,C#,Data Structures,Collections,在C#中,我有一个用例,其中我有一个从ints到集合的映射 ints是从1到n的密集(但不是压缩)集,其中n未知 单元格将以随机顺序加载 每个单元的边际成本应该是理想的(与列表或T[]一样好) 我想按需填写默认单元格 这个的最佳结构是什么 一个列表可以很好地工作(在空间中比字典更好),从中派生出我想要的东西,但有更好的吗?因为最好的代码是你不写的代码。一本字典听起来很适合我。或者您可以非常轻松地使用列表,只需确保在必要时将其展开即可: public static void EnsureCou

在C#中,我有一个用例,其中我有一个从
int
s到集合的映射

  • int
    s是从1到n的密集(但不是压缩)集,其中n未知
  • 单元格将以随机顺序加载
  • 每个单元的边际成本应该是理想的(与
    列表
    T[]
    一样好)
  • 我想按需填写默认单元格
这个的最佳结构是什么

一个
列表
可以很好地工作(在空间中比
字典
更好),从中派生出我想要的东西,但有更好的吗?因为最好的代码是你不写的代码。

一本
字典
听起来很适合我。或者您可以非常轻松地使用
列表
,只需确保在必要时将其展开即可:

public static void EnsureCount<T>(List<T> list, int count)
{
    if (list.Count > count)
    {
        return;
    }
    if (list.Capacity < count)
    {
        // Always at least double the capacity, to reduce
        // the number of expansions required
        list.Capacity = Math.Max(list.Capacity*2, count);
    }
    list.AddRange(Enumerable.Repeat(default(T), list.Capacity-list.Count));
}
公共静态重新计数(列表、整数计数)
{
如果(list.Count>Count)
{
回来
}
如果(列表容量<计数)
{
//始终至少将容量增加一倍,以减少
//所需的扩展数
list.Capacity=Math.Max(list.Capacity*2,计数);
}
AddRange(Enumerable.Repeat(默认值(T)、list.Capacity list.Count));
}
A
字典
听起来很适合我。或者您可以非常轻松地使用
列表
,只需确保在必要时将其展开即可:

public static void EnsureCount<T>(List<T> list, int count)
{
    if (list.Count > count)
    {
        return;
    }
    if (list.Capacity < count)
    {
        // Always at least double the capacity, to reduce
        // the number of expansions required
        list.Capacity = Math.Max(list.Capacity*2, count);
    }
    list.AddRange(Enumerable.Repeat(default(T), list.Capacity-list.Count));
}
公共静态重新计数(列表、整数计数)
{
如果(list.Count>Count)
{
回来
}
如果(列表容量<计数)
{
//始终至少将容量增加一倍,以减少
//所需的扩展数
list.Capacity=Math.Max(list.Capacity*2,计数);
}
AddRange(Enumerable.Repeat(默认值(T)、list.Capacity list.Count));
}

如果你想成为一个真正的坚持者,一个选择是编写一个facade类,它提供了一个围绕许多不同映射器的策略。使其在N小于某个值且负载(打包度)超过某个阈值时使用静态定义的数组。当超过某些阈值时,将其交换到树或字典表示形式

您没有说明在构建此数据结构后计划如何实际与之交互,因此根据您的访问/使用模式,混合策略可能提供比坚持单一数据表示更好的运行时行为。以类似的方式思考,当要排序的集合的数据元素少于N个时,快速排序算法实现有时会切换到更简单的排序算法


干杯

如果你想成为一个真正的坚持者,一个选择是编写一个facade类,它提供了一个围绕许多不同映射器的策略。使其在N小于某个值且负载(打包度)超过某个阈值时使用静态定义的数组。当超过某些阈值时,将其交换到树或字典表示形式

您没有说明在构建此数据结构后计划如何实际与之交互,因此根据您的访问/使用模式,混合策略可能提供比坚持单一数据表示更好的运行时行为。以类似的方式思考,当要排序的集合的数据元素少于N个时,快速排序算法实现有时会切换到更简单的排序算法


干杯

我想利用你在评论时答案的密集性:)是的。你的想法和我一样,是否有人发布代码将其填充到索引函数中?好吧,你可以使用扩展方法使其更易于调用(只需在C#3.0中的arg之前添加“this”),我建议执行
list.Capacity=Math.max(count,list.Capacity*2)
,因为这将减少此方法重复调用的重复分配。我想利用您在评论时编辑的答案的密集性:)是的。你的想法和我一样,是否有人发布代码将其填充到索引函数中?好吧,你可以使用扩展方法使其更易于调用(只需在C#3.0中的arg之前添加“this”),我建议执行
list.Capacity=Math.max(count,list.Capacity*2)
,因为这将减少此方法重复调用的重复分配。此问题与该问题相关:此问题与该问题相关: