2015-04-07 56 views
-2

這是我的代碼摘錄Clear()方法清除其它變量也

List<int> Ids = new List<int>(); 
var transModelIds = db.TableName.ToList(); 
var statModelIds = db.TableName1.ToList(); 
foreach (var user in metaData){ 

    foreach(var s in someData){ 
    Ids.Clear(); 
    Ids = s.Type.Equals(<Condition>) ? transModelIds : statModelIds; 
... 
    } 
} 

什麼情況是someData循環的第一次迭代之後,

當執行Ids.Clear(),IDS ,transModelIds,statModelIds全部將被清除

爲什麼?

但是如果我把Ids.Clear()上面的for循環,將工作:

Ids.Clear(); 
foreach(var s in someData){<...Code...>} 

的代碼工作正常

+2

請顯示一個簡短但完整的程序來展示問題。目前我們沒有足夠的信息來幫助你。 –

+2

請注意,[標籤:模型視圖控制器]是針對有關*模式*的問題;如果您的問題涉及ASP.NET實現,請使用[tag:asp.net-mvc]標籤。 –

+0

@TiesonT。這並不是說這個問題與任何類型的MVC,模式都沒有任何關係。標籤刪除完全合適。 = D –

回答

2

問題是,列表< T>是一個引用類型。如果你的代碼:

Ids = s.Type.Equals(<Condition>) ? transModelIds : statModelIds; 

你不要複製列表中,但使參考Ids指向同一列表(一個或多個)。

要解決這個問題:

List<int> Ids = new List<int>(); 
var transModelIds = db.TableName.ToList(); 
var statModelIds = db.TableName1.ToList(); 
foreach (var user in metaData){ 

    foreach(var s in someData){ 
     Ids.Clear(); 
     Ids.AddRange(s.Type.Equals(<Condition>) ? transModelIds : statModelIds); 
     /*... don't set the reference to the list but add the items from the source to your destination */ 
    } 
} 

替代你也能建立在內環一個新的列表,如果你只在此範圍內需要它(如Jon的評論媒體鏈接建議我們不能沒有完整的工作幫助代碼):

var transModelIds = db.TableName.ToList(); 
var statModelIds = db.TableName1.ToList(); 
foreach (var user in metaData){ 

    foreach(var s in someData){ 
     List<int> ids = new List<int>(); 
     ids.AddRange(s.Type.Equals(<Condition>) ? transModelIds : statModelIds); 
     /*... don't set the reference to the list but add the items from the source to your destination */ 
    } 
} 

然而,你可以問自己一個問題是:

我需要臨時LIS t呢?

在這種情況下,只需像您一樣設置列表的引用,但不要清除它。

編輯

外部範圍:

var transModelIds = db.TableName.ToList(); 
var statModelIds = db.TableName1.ToList(); 
List<int> ids = null; 
foreach (var user in metaData){ 

    foreach(var s in someData){ 
     ids = s.Type.Equals(<Condition>) ? transModelIds : statModelIds; 
     /*... additional code but don't modify the lists (clear or remove single items, etc...) ...*/ 
    } 
} 

內部範圍:

var transModelIds = db.TableName.ToList(); 
var statModelIds = db.TableName1.ToList(); 
foreach (var user in metaData){ 

    foreach(var s in someData){ 
     List<int> ids = s.Type.Equals(<Condition>) ? transModelIds : statModelIds; 
     /*... additional code but don't modify the lists (clear or remove single items, etc...) ...*/ 
    } 
} 
+0

只是要清楚,它會產生多少差異? – Biswajeet

+1

@Biswajeet很多。實現取決於是否需要擁有一份列表副本(需要額外的內存),或僅僅是對這兩個列表中的任何一個的引用......我將添加不將列表複製到答案的情況。 –

+0

非常感謝, 因爲我們必須分配多次,addrange有時會產生重複(需要),所以我們保留了那個Ids.clear,然後添加了addRange。 – Biswajeet

3

讓我們來看看在這個循環的情況下會發生什麼foreach(var s in someData)將被執行更多的一次。

在第一次迭代中,您將清除Ids,然後指定(基於某些條件)Ids = transModelIdsIds = statModelIds

由於List<T>參考類型 - 在這種情況下,你不是抄襲這些列表的內容回Ids正如你所期待的,但你創建指向transModelIdsstatModelIds另一個參考

而且在你再次清除Ids循環的下一次迭代,但因爲現在是參考transModelIdsstatModelIds - 你只是清除這些列表。

2

你assinging transModelIds和statModelIds到IDS列表。一旦清除了ID列表,您也將清除分配給它的所有列表。看看下面的代碼:

 List<int> list1 = new List<int>(); 
     List<int> list2 = new List<int>(); 

     list1.Add(1); 
     list1.Add(2); 
     list1.Add(3); 
     list1.Add(4); 
     list1.Add(5); 

     list2 = list1; 

     list2.Clear(); 

     Console.WriteLine(list1.Count + " " + list2.Count); 

     Console.ReadLine(); 

當您清除這兩個列表,它會顯示「0 0」。

+0

Gullie這幫我理解了這個參考問題,謝謝 – Biswajeet

+0

複製兩個列表的數據的方法是遍歷所有的元素源列表並將它們添加到第二個列表。按項目逐項。 –

+0

是通過使用Add()或AddRange()方法,得到它 – Biswajeet