using System.Collections.Generic;
public static void Main()
IndexTests.CanIndexAndQuery();
public interface IIndexer {
void Index(string docId, string text);
List<string> Query(string term);
void Delete(string docId);
public class CustomIndexer : IIndexer {
private readonly Dictionary<string, List<string>> _data;
_data = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase);
public void Index(string docId, string text) {
var words = text.Split();
if (!_data.TryGetValue(docId, out w)) {
_data.Add(docId, words.ToList());
foreach (var term in words) {
if (_data.TryGetValue(term, out val) == false) {
val = new List<string>();
public List<string> Query(string term) {
_data.TryGetValue(term, out val);
return val ?? new List<string>();
public void Delete(string docId) {
var terms = _data[docId];
foreach (var t in terms) {
public class Indexer : IIndexer {
private readonly Dictionary<string, List<string>> _terms;
private readonly Dictionary<string, string[]> _docIds;
_terms = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase);
_docIds = new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase);
public void Index(string docId, string text) {
var words = text.Split();
if (!_docIds.TryGetValue(docId, out w)) {
_docIds.Add(docId, words);
foreach (var term in words) {
if (_terms.TryGetValue(term, out val) == false) {
val = new List<string>();
public List<string> Query(string term) {
_terms.TryGetValue(term, out val);
return val ?? new List<string>();
public void Delete(string docId) {
throw new NotImplementedException();
public class IndexTests {
public static void CanIndexAndQuery() {
var index = new CustomIndexer();
index.Index("users/1", "Oren Eini");
index.Index("users/3", "Oren Eini");
index.Index("users/2", "Hibernating Rhinos");
var b1 = index.Query("eini").Contains("users/1");
var b2 = index.Query("rhinos").Contains("users/2");
Console.WriteLine(b1 && b2);
public static void CanUpdate() {
var index = new CustomIndexer();
index.Index("users/1", "Oren Eini");
index.Index("users/3", "Oren Eini");
index.Index("users/2", "Hibernating Rhinos");
index.Index("users/1", "Ayende Rahien");
var b1 = index.Query("Rahien").Contains("users/1");
var b2 = index.Query("eini").Count() == 1;
var b3 = index.Query("eini").Contains("users/3");
Console.WriteLine(b1 && b2 && b3);
public static void CanDelete() {
var index = new CustomIndexer();
index.Index("users/1", "Oren Eini");
index.Index("users/3", "Oren Eini");
index.Index("users/2", "Hibernating Rhinos");
var b1 = index.Query("Oren").Contains("users/3");
var b2 = index.Query("eini").Count() == 1;
var b3 = index.Query("Hibernating").Contains("users/2");
Console.WriteLine(b1 && b2 && b3);