我试图修改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