mubeen
mubeen

Reputation: 839

C# Linq - .ForEach updating all property value of the collection

When using .ForEach to update the RemarkText property in an object. It is updating the RemarkText property value on the remarksToDeleteandendTransactionResponse` property.

        private List<Remark> GetElementsToDelete(Gds.Response.CreateResponse endTransactionResponse, List<Remark> ticketRemarks, List<Remark> elementsToAdd)
        {
            var remarksToDelete = new List<Remark>();
            foreach (var ticketRemark in ticketRemarks)
            {
                ticketRemark.RemarkText = TrimEnd(ticketRemark.RemarkText);

                var remarks = endTransactionResponse.Remarks.Where(
                    x => x.RemarkType == ticketRemark.RemarkType
                    && (x.RemarkType == RemarkTypes.END || this.remarkText.Any(x.RemarkText.ToUpper().Contains))
                    && x.GdsReference != null
                    && !string.IsNullOrEmpty(x.GdsReference.GdsReferenceId));

                if (remarks.Any())
                {
                    remarks.Where(x => !x.RemarkText.Contains(PassengerTypes.INF.ToString()))
                        .ToList()
                        .ForEach(x => x.RemarkText = ticketRemark.RemarkText);
                    remarksToDelete.AddRange(remarks);
                }
                else
                {
                    elementsToAdd.Add(ticketRemark);
                }
            }

            return remarksToDelete;
        }

I tried to use ToList() with endTransactionResponse.Remarks.Where(...).ToList(), also tried to add new list new List(newRemarks), I also tried to use .Select(x => { x.RemarkText = ticketRemark.RemarkText; return x }); but none work for me.

Why this is happening? How can we fix the problem?

The response will be highly appreciated.

Upvotes: 0

Views: 980

Answers (1)

Steve
Steve

Reputation: 216253

You can simplify everything using a normal foreach acting over the IEnumerable remarks and extracting only the remarks that you need to delete.

if(remarks.Any())
{
    foreach(Remark r in remarks.Where(x => !x.RemarkText.Contains(PassengerTypes.INF.ToString()))
    {
         r.RemarkText = ticketRemark.RemarkText;
         remarksToDelete.Add(r);
    }
}

In your code you create a new List with ToList() and then proceed to change the RemarkText for every object materialized by the ToList(). But this list is never assigned to anything. Not certainly to the remarks IEnumerable, so your changes are lost.

Upvotes: 2

Related Questions