Search code examples
c#linqfilestream

How to apply contain on last record and delete if found in LINQ?


I have a list of strings like

AAPL,28/03/2012,88.34,88.778,87.187,88.231,163682382
AAPL,29/03/2012,87.54,88.08,86.747,87.123,151551216
FB,30/03/2012,86.967,87.223,85.42,85.65,182255227

Now I want to delete only last record if it does not contains AAPL(symbol name) using LINQ.

Below I have write my code which contains multiple line but I want to make it single line code,

fileLines = System.IO.File.ReadAllLines(fileName).AsParallel().Skip(1).ToList();
var lastLine = fileLines.Last();
if (!lastLine.Contains(item.sym))
{
    fileLines.RemoveAt(fileLines.Count - 1);
}

So How can I make all it in single line linq query ?


Solution

  • You could use the ternary operator to decide on the tail to concatenate as follows.

    fileLines
        = fileLines.Take(fileLines.Count())
                   .Concat(fileLines.Last().Contains(item.sym) ? Enumerable.Empty
                                                               : new string[]{ item.sym });
    

    You could formulate it even more contracted as follows.

    fileLines
        = System.IO.File.ReadAllLines(fileName)
                        .AsParallel()
                        .Skip(1)
                        .Take(fileLines.Count())
                        .Concat(fileLines.Last().Contains(item.sym) ? Enumerable.Empty
                                                                    : new string[]{ item.sym });
                        .ToList();
    

    That being said, such an endeavour is questionable. The accumulation of lazily evaluated Linq extension methods is difficult to debug.