Code/Functions/Statistical/ModeFunction.cs
using Expressive.Expressions;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace Expressive.Functions.Statistical
{
    internal class ModeFunction : FunctionBase
    {
        #region FunctionBase Members

        public override string Name { get { return "Mode"; } }

        public override object Evaluate(IExpression[] parameters, Context context)
        {
            this.ValidateParameterCount(parameters, -1, 1);
            
            IList<object> values = new List<object>();

            foreach (var p in parameters)
            {
                var value = p.Evaluate(this.Variables);
                var enumerable = value as IEnumerable;

                if (enumerable != null)
                {
                    foreach (var item in enumerable)
                    {
                        values.Add(item);
                    }
                }
                else
                {
                    values.Add(value);
                }
            }

            var groups = values.GroupBy(v => v);
            int maxCount = groups.Max(g => g.Count());
            return groups.First(g => g.Count() == maxCount).Key;
        }

        #endregion
    }
}