У меня проблема с попыткой изменить список транзакций в пределах foreach. Я создал копии списка, переданного в мой метод, сделал его только для чтения, и все же, когда я пытаюсь изменить значение в любом из списков, оно меняет это значение внутри них. Какой-то тип памяти? Я не уверен, как решить эту проблему.Нежелательная модификация списка
Моя программа начинается с объявления класса Transaction (который является общим классом с именем, значением, форматированием), тогда у меня есть subClasses: Transaction. Я создаю TransList (из открытого класса TransList: IEnumerable), который имеет экземпляр объекта для каждого подкласса. Таким образом, TransList будет включать класс с именем TranID, Amount, OrderID, Time, CardType, Comment1, Comment2. Каждое значение этих подклассов может быть строковым, десятичным, DateTime. После этого создается список TransParts, который затем помещается в более крупный список, называемый processTrans.
So Comment2 - это элемент с номером ссылки на оплату, и если там есть более одного номера, я хочу разделить это на несколько TransList, чтобы добавить эти новые TransLists в processTrans и удалить неразделенный. Из моего кода ниже, пробовав каждую стратегию, изменение времени выполнения происходит не только с предполагаемыми processTrans, но и с tempProcessTrans, addOn, tran, tranPart.
Если processTrans, который передается в метод выглядит в отладчике местного
processTrans [0] _Items TranID.Value = SD234DF и Comment2 = ADF; WER;
Тогда выходной сигнал должен быть
processTrans [0] _Items TranID.Value = SD234DF-1 и Comment2.Value = ADF
processTrans [1] _Items TranID.Value = SD234DF-2 и Comment2.Value = Wer
I В настоящее время получить
processTrans [0] _Items TranID.Value = SD234DF-1-2 и Comment2.Value = Wer
processTrans [1] _Items TranID.Value = SD234DF-1-2 и Comment2.Value = Wer
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