Woah, I'm so wet. This ain't DRY at all.

```CSharp
        public ScaleoutSubscription(string identity,
                                    IList<string> eventKeys,
                                    string cursor,
                                    IList<ScaleoutMappingStore> streams,
                                    Func<MessageResult, object, Task<bool>> callback,
                                    int maxMessages,
                                    IPerformanceCounterManager counters,
                                    object state)
            : base(identity, eventKeys, callback, maxMessages, counters, state)
        {
            if (streams == null)
            {
                throw new ArgumentNullException("streams");
            }

            _streams = streams;

            if (!String.IsNullOrEmpty(cursor))
            {
                _cursors = Cursor.GetCursors(cursor, _streams.Count);
                // If there are too few cursors, this means a stream has been added and the cursor should be reset
                if (_cursors != null && _cursors.Count < streams.Count)
                {
                    _cursors = null;
                }
            }

            if (_cursors == null)
            {
                _cursors = new List<Cursor>(streams.Count);
                for (int i = 0; i < streams.Count; i++)
                {
                    ScaleoutMapping maxMapping = streams[i].MaxMapping;

                    ulong id = UInt64.MaxValue;
                    string key = i.ToString(CultureInfo.InvariantCulture);

                    if (maxMapping != null)
                    {
                        id = maxMapping.Id;
                    }

                    _cursors.Add(new Cursor(key, id));
                }
            }
        }
```

I also think that this is more correct, because if a streams/topics have been added or removed the old cursor should be considered completely invalid. It might be better to pass a nullable int to `Cursor.GetCursors` representing the exact number of cursors you expect. If this value isn't null, and the number of cursors doesn't match, `Cursor.GetCursors` should simply return null.