我試圖修改foreach中的事務列表時遇到問題。我創建了傳遞給我的方法的列表的副本,使其成爲只讀的,但是當我嘗試更改任何列表中的值時,它將更改其中的值。某種類型的記憶鏈接?我不確定如何解決此問題。我的程序從聲明一個名爲Transaction的類(它是一個具有Name,Value,Formatting的泛型類)開始,然後我有子類:Transaction。我創建了TransList(來自公共類TransList:IEnumerable),它具有每個子類的對象實例。所以TransList將包含一個名爲TranID,Amount,OrderID,Time,CardType,Comment1,Comment2的類。這些子類的每個值都可以是字符串,小數點,日期時間。之後,創建TransParts列表,然後將其放入名爲processTrans的更大列表中。不需要的列表修改
所以Comment2是帶有付款引用號碼的元素,如果在那裏有多個數字,我想將它分隔成多個TransList將這些新的TransLists添加到processTrans並刪除未分離的一個。從我的代碼中,嘗試了所有的策略,運行時修改不僅發生在預期的processTrans上,而且發生在tempProcessTrans,addOn,tran,tranPart。
如果傳遞到方法processTrans看起來像這樣在調試器當地人
processTrans [0] _items TranID.Value = SD234DF和註釋2 = ADF; WER;
然後輸出應爲
processTrans [0] _items TranID.Value = SD234DF-1和Comment2.Value = ADF
processTrans [1] _items TranID.Value = SD234DF-2和Comment2.Value =疫情週報
我目前得到
processTrans [0] _items TranID.Value = SD234DF-1-2和Comment2.Value =疫情週報
processTrans [1] _items TranID.Value = SD234DF-1-2和Comment2.Value =疫情週報
public static List<TransList> SeperateMultiCitations(List<TransList> processTrans) //change TransList seperating Multiple Citations
{
List<int> indexes=new List<int>();
IList<TransList> tempProcessTrans = processTrans.AsReadOnly(); //this didn't help
List<TransList> addOn= new List<TransList>(); //copy list didn't stop from changes to occur in processTrans at same time
foreach (TransList tran in tempProcessTrans.ToList())
{
TransList copyTransList = tran;
foreach (Transaction tranPart in tran.OfType<Comment2>())
{
if (new Regex(";.+;").IsMatch((string)tranPart.Value, 0))
{
string[] citations = Regex.Split((string)tranPart.Value, ";").Where(s => s != String.Empty).ToArray();
int citNumb = 1;
indexes.Add(tempProcessTrans.IndexOf(tran));
foreach (string singleCitation in citations)
{
addOn.Add(ChangeTrans(tran, singleCitation, citNumb++)); when this line runs changes occur to all lists as well as trans, tranPart
}
break;
}
}
}
foreach (int index in indexes.OrderByDescending(x => x))
{
processTrans.RemoveAt(index);
}
processTrans.AddRange(addOn);
return processTrans;
}
public static TransList ChangeTrans(TransList copyTransList, string singleCitation, int citNumb) //add ConFee
{
foreach (Transaction temp in copyTransList.OfType<TranID>())
{
temp.Value += "-" + citNumb;
}
foreach(Transaction temp in copyTransList.OfType<Comment2>())
{
temp.Value = singleCitation;
}
foreach (Transaction temp in copyTransList.OfType<Amount>())
{
//temp.Value = DboGrab(temp);
//temp.Value = amount;
}
return copyTransList;
}
public class Transaction : TranInterface
{
public string Name;
public object Value;
public string Formating;
public Transaction(string name, object value, string formating)
{
Name = name;
Value = value;
Formating = formating;
}
}
class TranID : Transaction
{
public TranID(string Name, string Value, string Formating) : base("Transaction ID", Value, "@") { }
}
public class TransList : IEnumerable<Transaction> //not to add all the lengthy parts here but this just allows for adding the parts and iterating through them in the foreach statements
{}
您可以顯示構建這些對象的代碼並將它們添加到原始列表中嗎? –
您並未創建對象的新實例,因此您在ChangeTrans中的修改發生在原始類上。如果我的問題是正確的,那麼在處理每個項目時,它將根據正則表達式的結果轉換爲一個或多個項目?如果你用更多關於結構的信息來重構問題,你可能會得到更好的答案。 –
TransList copyTransList = tran;不會複製'tran'。它僅爲tran創建了另一個參考。你想要一個深度拷貝。這通常是通過構造一個構造函數來完成它自己的類型的對象,然後複製所有的值。 – MrFox