Ejemplo n.º 1
0
        private VersionedList <T> _removeWhere(Func <T, int, bool> predicate)
        {
            var pairs = Items
                        .Select((T item, int i) => new { Index = i, Item = item })
                        .ToArray();

            var pairsToRemove = pairs
                                .Where(pair => predicate(pair.Item, pair.Index))
                                .OrderByDescending(pair => pair.Index)
                                .ToArray();

            var remaining = pairs
                            .Where(pair => !predicate(pair.Item, pair.Index))
                            .Select(pair => pair.Item);

            var changes = Enumerable.Range(0, pairsToRemove.Length)
                          .Select(i => ListChange.Removed(Version + i, pairsToRemove[i].Index, pairsToRemove[i].Item));

            return(new VersionedList <T>(
                       ImmutableList.CreateRange(remaining),
                       Version + pairsToRemove.Length,
                       Changes.AddRange(changes)
                       ));
        }