2012-06-16 42 views
0

以下是兩段代碼我用於計算在一個列表在c#重置列表

碼1)

public static List<List<int>> getCpower(List<int> list) 
    { 
     var result = new List<List<int>>(); 
     for (int i = 0; i < (1 << list.Count); i++) 
     { 
      var sublist = new List<int>(); 
      for (int j = 0; j < list.Count; j++) 
      { if ((i & (1 << j)) != 0) 
       { sublist.Add(list[j]); 
       } 
      } 
      result.Add(sublist); 
     } 

     return result; 
    } 

碼2)

public static List<List<int>> getCpower(List<int> list) 
    { 
     var result = new List<List<int>>();var sublist = new List<int>(); 
     for (int i = 0; i < (1 << list.Count); i++) 
     { 
      sublist.Clear();sublist.TrimExcess(); 
      for (int j = 0; j < list.Count; j++) 
      { if ((i & (1 << j)) != 0) 
       { sublist.Add(list[j]); 
       } 
      } 
      result.Add(sublist); 
     } 

     return result; 
    } 

第一元件的功率組代碼使用了一個新的語句,如果我試圖找出列表的powersets與計數30,然後OutOfMemoryException出現。所以爲了節省內存我使用Clear()和TrimExcess()來獲取列表,就好像它是使用一個新的語句在鱈魚初始化E2。但是這兩個代碼返回不同的結果。我不明白爲什麼會發生這種情況。請幫忙。

是兩個以下兩件沒有做同樣的事情

for(....) 
     { 
     var sublist = new List<int>(); 
     for(......) 
      { 
      //some code 
      } 
     } 

var sublist = new List<int>(); 
for(.....) 
    { 
     sublist.Clear();sublist.TrimExcess(); 
     for(....) 
     { 
     //some code 
     } 
    } 
+0

我猜你知道你會得到1073741824套,其中有30 –

+0

2^30。是的,我確實有一個想法,它的功率有多大。 – Dynamite

回答

5

在你的第二個代碼,你只能有一個嵌套列表 - 要添加一些引用是指相同的子列表,這是毫無意義的。

您是否認爲,您的第一個代碼可能是空間不足的原因是您從根本上試圖在內存中保存太多數據?

你可以考慮返回一個IEnumerable<List<int>>這樣的:

public static IEnumerable<List<int>> getCpower(List<int> list) 
{ 
    for (int i = 0; i < (1 << list.Count); i++) 
    { 
     var sublist = new List<int>(); 
     for (int j = 0; j < list.Count; j++) 
     { if ((i & (1 << j)) != 0) 
      { 
       sublist.Add(list[j]); 
      } 
     } 
     yield return sublist; 
    } 
} 

現在將懶洋洋地評估 - 所以你可以遍歷頂級序列,但除非該名單是由主叫方保留,你」一次只能在內存中擁有一個列表。

+0

你能解釋一下「收益回報子列表」嗎?它是否將子列表的內容添加到結果中並釋放子列表使用的空間? – Dynamite

+0

@Dynamite:這是一個複雜的功能,稱爲「迭代塊」。請參閱http://msdn.microsoft.com/en-us/library/dscyy5s0.aspx –

+0

仍然我的問題沒有解決。我仍然得到OutofMemoryException,我必須運行該函數以獲得更高的計數。 – Dynamite

0

在第二部分的代碼你正在清理結果列表。這改變了算法的結果。你正在拋棄你的結果,因爲你正在重複使用相同的列表實例進行所有迭代。

0

在第二個代碼示例中,您只有一個sublist實例。每次循環時,同一個實例將被清除並重新添加到列表中。下面是一個例子,以幫助您瞭解:

var sublist = new List<int> { 1, 2, 3 }; 
var result = new List<List<int>> { sublist }; 
//result[0] is now {1, 2, 3} 
sublist.Clear(); 
//result[0] is now {} 
result.Add(sublist); 
//result[0], result[1], and sublist are the same instance