private int MaxPacksSince(Func <CardInstance, bool> filter)
        {
            if (OrderedPacks.Count() == 0)
            {
                return(0);
            }

            //indexes of searched packs
            var packIndexes = OrderedPacks.Select((p, index) => new { p, index })
                              .Where(col => col.p.Cards.Any(filter))
                              .Select(col => col.index);

            if (packIndexes.Count() == 0)
            {
                //nothing fulfills filter - return all!
                return(OrderedPacks.Count());
            }
            else if (packIndexes.Count() == 1)
            {
                return(packIndexes.First());
            }
            else
            {
                return(Math.Max(packIndexes.First(),
                                packIndexes.Zip(packIndexes.Skip(1), (x, y) => y - x).Max()
                                ));
            }
        }
 private int PacksSince(Func <CardInstance, bool> filter)
 {
     if (OrderedPacks.Count() == 0)
     {
         return(0);
     }
     return(OrderedPacks
            .Where(p =>
                   p.DateOpened > OrderedPacks
                   .Where(p2 => p2.Cards.Any(filter))
                   .DefaultIfEmpty(new Pack()
     {
         DateOpened = DateTime.MinValue
     })
                   .FirstOrDefault()
                   .DateOpened
                   ).Count());
 }