public ChainItem GetOrAdd(string value) { ChainItem item; if (!_items.TryGetValue(value, out item)) { item = new ChainItem(value); _items [value] = item; } return(item); }
public void LearnFrom(IEnumerable <string> lines, ISplitter splitter) { _items.Clear(); _separator = splitter.Separator; _endOfSequence = splitter.EndOfSequence; foreach (var l in lines) { bool atStart = true; ChainItem current = null; foreach (string item in splitter.Split(l)) { if (item == splitter.EndOfSequence) { if (current != null) { current.CanFinish = true; } atStart = true; continue; } var next = GetOrAdd(item); if (!atStart) { current.Register(next.Value); } else { if (char.IsUpper(next.Value[0])) { next.CanStart = true; } atStart = false; } current = next; } } Normalize(); }
public string Generate(int maxLength, IRandomSource random) { ChainItem current = null; var result = new StringBuilder(); int count = 0; while (count < maxLength) { if (current == null) { current = _items.Values.Where(i => i.CanStart).OrderBy(_ => Builders.Build <int>(random)).First(); result.Append(current.Value); count++; continue; } if (current.CanFinish && Builders.Build <byte>(random) % 10 < 3) { result.Append(_endOfSequence + _separator); current = null; continue; } var next = current.PickNext(random); if (next == null) { result.Append(_endOfSequence + _separator); current = null; continue; } current = _items [next]; result.Append(_separator + current.Value); count++; } return(result.ToString()); }
public ChainItem GetOrAdd(string value) { ChainItem item; if (!_items.TryGetValue (value, out item)) { item = new ChainItem (value); _items [value] = item; } return item; }