C# 从哈希表复制n个k/v对

C# 从哈希表复制n个k/v对,c#,hashtable,enumerator,C#,Hashtable,Enumerator,我有一个包含n个记录的哈希表。我需要复制x和y之间的记录,并遍历它们 我该怎么做 例如: HT1.计数=500 HT2=HT1[0]-HT1[100] --编辑-- 正如您所知,原因是我正在从.MSG文件生成PDF。最终用户遇到的问题是,当他们获得12GB的PDF时,会导致问题:P 我需要将PDF分解为250条消息,然后开始一个新的PDF。因此,顺序并不重要,每次返回相同的记录也不重要,因为它只会执行一次。我建议您查阅有关哈希表的参考资料。哈希表通常是无序的,因此您的问题没有意义。我打赌会执行如

我有一个包含n个记录的哈希表。我需要复制x和y之间的记录,并遍历它们

我该怎么做

例如:

HT1.计数=500

HT2=HT1[0]-HT1[100]

--编辑--

正如您所知,原因是我正在从.MSG文件生成PDF。最终用户遇到的问题是,当他们获得12GB的PDF时,会导致问题:P


我需要将PDF分解为250条消息,然后开始一个新的PDF。因此,顺序并不重要,每次返回相同的记录也不重要,因为它只会执行一次。

我建议您查阅有关哈希表的参考资料。哈希表通常是无序的,因此您的问题没有意义。

我打赌会执行如下自定义函数:

public IEnumerable<object> GetRange(Hashtable ht, int min, int max) {
    int i = 0;
    foreach (var key in ht.Keys) {
        i++;
        if (i > max) {
            yield break;
        }
        if (i >= min) {
            yield return ht[key];
        } else continue;
    }
}
    public IDictionary<int, T> GetRange<T>(
        IDictionary<int, T> source, int min, int max)
    {
        // add error checking for min,max, null, etc...
        int capacity = Math.Max(0, max - min);
        Dictionary<int, T> target = new Dictionary<int, T>(capacity);
        for (int key = min; key < max; key++)
        {
            if (source.ContainsKey(key))
            {
                target.Add(key, source[key]);
            }
        }
        return target;
    }
public IEnumerable GetRange(哈希表ht、int-min、int-max){
int i=0;
foreach(ht.Keys中的变量键){
i++;
如果(i>max){
屈服断裂;
}
如果(i>=min){
收益率返回ht[键];
}否则继续;
}
}

但是,考虑到键的顺序没有保证,因此这可能有一个无序的对象序列

,正如其他人所说的,您不能以您希望的方式在哈希表上迭代。另一方面,如果您想要的是关键点位于该范围内的结果,则可以执行以下操作:

public IEnumerable<object> GetRange(Hashtable ht, int min, int max) {
    int i = 0;
    foreach (var key in ht.Keys) {
        i++;
        if (i > max) {
            yield break;
        }
        if (i >= min) {
            yield return ht[key];
        } else continue;
    }
}
    public IDictionary<int, T> GetRange<T>(
        IDictionary<int, T> source, int min, int max)
    {
        // add error checking for min,max, null, etc...
        int capacity = Math.Max(0, max - min);
        Dictionary<int, T> target = new Dictionary<int, T>(capacity);
        for (int key = min; key < max; key++)
        {
            if (source.ContainsKey(key))
            {
                target.Add(key, source[key]);
            }
        }
        return target;
    }
公共IDictionary GetRange(
IDictionary源,int最小值,int最大值)
{
//添加最小值、最大值、空值等的错误检查。。。
int capacity=Math.Max(0,Max-min);
字典目标=新字典(容量);
用于(int key=min;key

请注意,我使用的是泛型版本(
Dictionary
)而不是旧的
哈希表
,但想法是一样的。

为什么要在哈希表上实现自定义函数?为什么不在GetEnumerator上使用foreach进行枚举,然后向HT2添加n个值呢。它可能不会每次都可靠地为您提供相同的N个项目,如果它提供了,那么一年后它可能也不会为您提供相同的项目。这就是为什么我不会费心使用收益率的原因。如果您手动创建一个枚举器(使用yield),您可能会向调用方暗示您正在控制输出。但你绝对不能。当然,你可以从中提取n个值,但是你不能保证它们是相同的,而且你也不能认为它们是真正随机的。他的问题相当于SQL中的select top(x)子句。你们要求的是数据抽样,不一定是随机或有序的,只是抽样数据。好的,我修正我的评论:你们可以随机选择N。然而,他回答问题的方式(“复制x和y之间的记录”)似乎暗示他正在寻找数据的某个特定确定性子集。