/// <summary>
        /// enumerableからfuncでIComparableを取得し,それが最小の要素を返す.
        /// </summary>
        public static T FindMin <T, S>(this IEnumerable <T> enumerable, Func <T, S> func) where S : IComparable
        {
            Contract.Requires(!IEnumerableUtil.IsNullOrEmpty(enumerable));

            var ret   = enumerable.First();
            var value = func(ret);

            foreach (var elem in enumerable)
            {
                S v = func(elem);
                if (v.CompareTo(value) < 0)
                {
                    value = v;
                    ret   = elem;
                }
            }

            return(ret);
        }