private IEnumerable <PlayerDeck> ParsePlayerDecks() { var playerDecks = _logParser.ParsePlayerDecks(); var playerDeckCreations = _logParser.ParsePlayerDeckCreations(); var playerDeckUpdates = _logParser.ParsePlayerDeckUpdates(); var playerDeckDeletions = _logParser.ParsePlayerDeckDeletions(); // merge existing decks and created decks var playerDecksConsolidated = playerDecks .Concat(playerDeckCreations) .GroupBy(pd => pd.Id) .Select(id => id.First()) .ToList(); // remove deleted decks playerDecksConsolidated.RemoveAll(pd => playerDeckDeletions.Contains(pd.Id)); // replace updated decks playerDecksConsolidated.ForEach(pd => { if (playerDeckUpdates.Any(u => u.Id == pd.Id)) { pd = playerDeckUpdates.Single(u => u.Id == pd.Id); } }); return(playerDecksConsolidated); }