2014-02-05 36 views
2

我有一個大的C#哈希集,我無法一次處理它。我需要提取具有給定大小的塊。我知道我可以遍歷散列並將每個元素複製到一個數組/列表中,以後可以處理,但是有沒有更快/更優雅的方法來處理?像一條線?切片一個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庫(這是大約有一個有用的東西),然後它有一個​​操作它你想要做什麼。

int batchSize = 1024; 

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