我经常使用另一组用于合并IDictionary方法的集合:
public static TValue Get<TKey, TValue>(this IDictionary<TKey, TValue> d, TKey key, Func<TValue> valueThunk)
{
TValue v = d.Get(key);
if (v == null)
{
v = valueThunk();
d.Add(key, v);
}
return v;
}
public static TValue Get<TKey, TValue>(this IDictionary<TKey, TValue> d, TKey key, TValue coalesce)
{
return Get(d, key, () => coalesce);
}
对于一般集合的操作:
public static IEnumerable<T> AsCollection<T>(this T item)
{
yield return item;
}
那么对于树形结构:
public static LinkedList<T> Up<T>(this T node, Func<T, T> parent)
{
var list = new LinkedList<T>();
node.Up(parent, n => list.AddFirst(n));
return list;
}
所以我可以轻松地遍历和操作类似的类:
class Category
{
public string Name { get; set; }
public Category Parent { get; set; }
}
下一步,为了方便函数组合和更加类似F#的C#编程方式:
public static Func<T, T> Func<T>(this Func<T, T> f)
{
return f;
}
public static Func<T1, R> Compose<T1, T2, R>(this Func<T1, T2> f, Func<T2, R> g)
{
return x => g(f(x));
}
for(int x=0; x<=16; ++x)
对有经验的程序员来说更易读。但是,闭区间往往较少使用。 - Tom Hawtin - tackline