2014-02-05 2 views
2

У меня есть большой C# Hashset, и я не могу обрабатывать все это сразу. Мне нужно извлечь куски с заданным размером. Я знаю, что могу перебирать хэш и копировать каждый элемент в массив/список, который может быть позже обработан, но есть ли более быстрый/более элегантный способ сделать это? Что-то вроде одной строки?Slice a 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(); 
     } 
    } 

Вот как я это сделал ... Я думал, что есть более элегантный способ, чем это. :(

+0

есть какие-либо образцы кода? – Carra

+0

не думаю, что это актуально. у меня есть HashSet с 200.000 строк, и мне нужно их все обрабатывать. Обработка всех 200k сразу не вариант. Так что, мне нужно принять все они в кусках 1k (скажем) и выполняют обработку. Я знаю, что могу написать свой собственный метод, который проходит через все 200k элементов и сохранить их в 1k буфере, а затем дать результат, но мой вопрос был, если это можно сделать с тем, что .net уже предлагает, что-то похожее на CopyTo. – dcg

ответ

2

Существует нет ничего встроенный.

Однако, если вы используете библиотеку MoreLinq (что полезная вещь, чтобы иметь вокруг), то он имеет Batch операцию, которая делает то, что вы хотите.

int batchSize = 1024; 

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