切片C#-Hashset

时间:2014-02-05 10:47:15

标签: c# arrays hashset slice

我有一个很大的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();
        }
    }

这就是我做到的......我当时认为有一种比这更优雅的方式。 :(

1 个答案:

答案 0 :(得分:2)

没有任何内置功能。<​​/ p>

但是如果你使用MoreLinq库(这是一个有用的东西),那么它有一个Batch操作,可以做你想要的。

int batchSize = 1024;

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