using System.Collections;
using System.Collections.Generic;
public static void Main(string[] args)
int[] ids = new[] { 1, 2, 3, 4, 5 };
var storage = new Storage();
Console.WriteLine("{0}: {1}", storage.GetStorageName(id), storage.GetContent(id));
var someStorage = new NotSoReliableStorage();
Console.WriteLine("{0}: {1}", someStorage.GetStorageName(id), someStorage.GetContent(id));
Console.WriteLine("{0}: NO CONTENT", someStorage.GetStorageName(id));
var betterStorage = new BetterNotSoReliableStorage();
if (betterStorage.TryGetContent(id, out message))
Console.WriteLine("{0}: {1}", betterStorage.GetStorageName(id), message);
Console.WriteLine("{0}: NO CONTENT", betterStorage.GetStorageName(id));
var maybeStorage = new MaybeStorage();
Console.WriteLine("{0}: {1}",
maybeStorage.GetStorageName(id),
maybeStorage.GetContent(id)
.DefaultIfEmpty(string.Format("NO CONTENT"))
public string GetStorageName(int id)
return Path.Combine(@"C:\", id + ".txt");
public string GetContent(int id)
return string.Concat(Enumerable.Repeat("hello ", id));
public class NotSoReliableStorage
public string GetStorageName(int id)
return Path.Combine(@"C:\", id + ".txt");
public string GetContent(int id)
throw new ArgumentException("Cannot find it");
return string.Concat(Enumerable.Repeat("hello ", id));
public class BetterNotSoReliableStorage
public string GetStorageName(int id)
return Path.Combine(@"C:\", id + ".txt");
public bool TryGetContent(int id, out string content)
content = string.Concat(Enumerable.Repeat("hello ", id));
public class MaybeStorage
public string GetStorageName(int id)
return Path.Combine(@"C:\", id + ".txt");
public Maybe<string> GetContent(int id)
return new Maybe<string>();
return new Maybe<string>(string.Concat(Enumerable.Repeat("hello ", id)));
public class Maybe<T> : IEnumerable<T>
private readonly IEnumerable<T> values;
this.values = new[] { value };
public IEnumerator<T> GetEnumerator()
return this.values.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator()
return this.GetEnumerator();