【问题标题】:Slice a C#-Hashset切片 C#-Hashset
【发布时间】:2014-02-05 10:47:14
【问题描述】:

我有一个很大的 C# Hashset,但我无法一次处理所有这些。我需要提取具有给定大小的块。我知道我可以遍历哈希并将每个元素复制到可以稍后处理的数组/列表中,但是有没有更快/更优雅的方法来做到这一点?单行之类的东西?

    public static IEnumerable<T[]> Slice<T>(this HashSet<T> h, int size)
    {
        if (0 >= size)
        {
            throw new Exception("0 or negative slice sizes are not accepted!");
        }

        if (null == h || 0 == h.Count)
        {
            yield return new T[0];
            yield break;
        }

        if (size >= h.Count)
        {
            yield return h.ToArray();
            yield break;
        }

        List<T> to_ret = new List<T>(size);
        foreach (T elem in h)
        {
            if (size == to_ret.Count)
            {
                yield return to_ret.ToArray();
                to_ret.Clear();
            }

            to_ret.Add(elem);
        }

        if (0 < to_ret.Count)
        {
            yield return to_ret.ToArray();
            to_ret.Clear();
        }
    }

我就是这样做的……我在想还有比这更优雅的方法。 :(

【问题讨论】:

  • 有代码示例吗?
  • 不要认为它是相关的。我有一个带有 200.000 个字符串的 Hashset,我需要全部处理它们。一次处理所有 200k 不是一种选择。所以,我需要把它们都分成 1k 块(比如说)并进行处理。我知道我可以编写自己的方法来循环遍历所有 200k 元素并将它们保存到 1k 缓冲区中然后产生结果,但我的问题是这是否可以使用 .net 已经提供的东西来完成,类似于 CopyTo 的东西。跨度>

标签: c# arrays hashset slice


【解决方案1】:

没有内置任何东西。

但是,如果您使用 MoreLinq 库(这是一个有用的东西),那么它有一个 Batch 操作可以满足您的需求。

int batchSize = 1024;

foreach (var batch in myHashSet.Batch(batchSize))
{
    foreach (var item in batch)
    {
        ...
    } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2010-09-29
    相关资源
    最近更新 更多