private UserAnalysisModel Analyze(IList <UserModel> users)
        {
            UserAnalysisModel model = new UserAnalysisModel();

            var femalePercentage = Calculators.PercentageFemale(users);
            var malePercentage   = 1 - femalePercentage;

            model.Gender = (femalePercentage, malePercentage);

            var firstNameLeftPercentage  = Calculators.PercentageFirstNameMidpoint(users);
            var firstNameRightPercentage = 1 - firstNameLeftPercentage;

            model.FirstName = (firstNameLeftPercentage, firstNameRightPercentage);

            var lastNameLeftPercentage  = Calculators.PercentageLastNameMidpoint(users);
            var lastNameRightPercentage = 1 - lastNameLeftPercentage;

            model.LastName = (lastNameLeftPercentage, lastNameRightPercentage);

            model.StatePercentages       = Calculators.PercentagePeopleInState(users);
            model.FemaleStatePercentages = Calculators.PercentageFemalesInState(users);
            model.MaleStatePercentages   = Calculators.PercentageMalesInState(users);
            model.AgeRangePercentages    = Calculators.PercentageAgeRanges(users);

            model.StateAverageAge = Calculators.StateAverageAge(users);

            return(model);
        }
        public ContentResult Analyze()
        {
            var result = new ContentResult();
            UserAnalysisModel model = null;

            try
            {
                var users = GetJsonCollectionFromRequest <UserModel>(Request, "results");
                model = Analyze(users);
            }
            catch (Exception ex)
            {
                result.Content    = ex.Message;
                result.StatusCode = 400;
                return(result);
            }


            switch (DetermineFileFormat(Request))
            {
            case FileFormat.Json:
                Response.ContentType = "application/json";
                result.Content       = Serializers.ToJson(model);
                break;

            case FileFormat.Xml:
                Response.ContentType = "application/xml";
                result.Content       = Serializers.ToXml(model);
                break;

            case FileFormat.Text:
            default:
                result.ContentType = "text/plain";
                result.Content     = Serializers.ToPlaintext(model);
                break;
            }

            return(result);
        }
Example #3
0
        public static string ToPlaintext(UserAnalysisModel analysis)
        {
            var output = new StringBuilder();

            output.AppendLine($"Percentage female versus male: {FormatPercentage(analysis.Gender.PercentFemale)}%");
            output.AppendLine($"Percentage of first names that start with A-M [{FormatPercentage(analysis.FirstName.PercentAtoM)}%] versus N-Z [{FormatPercentage(analysis.FirstName.PercentNtoZ)}%]");
            output.AppendLine($"Percentage of last names that start with A-M [{FormatPercentage(analysis.LastName.PercentAtoM)}%] versus N-Z [{FormatPercentage(analysis.LastName.PercentNtoZ)}%]");
            var top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.StatePercentages);

            output.AppendLine("10 most populous states and the percentage of people in each state:");
            foreach (var state in top10)
            {
                output.AppendLine($"\t{state.Key}: {FormatPercentage(state.Value)}%");
            }
            output.AppendLine("10 most populous female states and the percentage of females in each state:");
            top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.FemaleStatePercentages);
            foreach (var state in top10)
            {
                output.AppendLine($"\t{state.Key}: {FormatPercentage(state.Value)}%");
            }
            output.AppendLine("10 most populous male states and the percentage of males in each state:");
            top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.MaleStatePercentages);
            foreach (var state in top10)
            {
                output.AppendLine($"\t{state.Key}: {FormatPercentage(state.Value)}%");
            }
            output.AppendLine("Percentage of people in the following age ranges:");
            foreach (var ageRangePercentage in analysis.AgeRangePercentages)
            {
                output.AppendLine($"\t{ageRangePercentage.Key}: {FormatPercentage(ageRangePercentage.Value)}%");
            }
            output.AppendLine("10 states with the highest average age:");
            top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.StateAverageAge);
            foreach (var state in top10)
            {
                output.AppendLine($"\t{state.Key}: {(state.Value)}");
            }
            return(output.ToString());
        }
Example #4
0
        public static string ToJson(UserAnalysisModel analysis)
        {
            var json       = string.Empty;
            var serializer = new JsonSerializer();

            using (var stringWriter = new StringWriter())
                using (var jsonWriter = new JsonTextWriter(stringWriter))
                {
                    jsonWriter.WriteStartObject();

                    jsonWriter.WritePropertyName("gender-pct");
                    jsonWriter.WriteStartObject();
                    jsonWriter.WritePropertyName("female");
                    jsonWriter.WriteValue(DecimalToPercent(analysis.Gender.PercentFemale));
                    jsonWriter.WritePropertyName("male");
                    jsonWriter.WriteValue(DecimalToPercent(analysis.Gender.PercentMale));
                    jsonWriter.WriteEndObject();

                    jsonWriter.WritePropertyName("name-initial-pct");
                    jsonWriter.WriteStartObject();
                    jsonWriter.WritePropertyName("first-name");
                    jsonWriter.WriteStartObject();
                    jsonWriter.WritePropertyName("a-m");
                    jsonWriter.WriteValue(DecimalToPercent(analysis.FirstName.PercentAtoM));
                    jsonWriter.WritePropertyName("n-z");
                    jsonWriter.WriteValue(DecimalToPercent(analysis.FirstName.PercentNtoZ));
                    jsonWriter.WriteEndObject();
                    jsonWriter.WritePropertyName("last-name");
                    jsonWriter.WriteStartObject();
                    jsonWriter.WritePropertyName("a-m");
                    jsonWriter.WriteValue(DecimalToPercent(analysis.LastName.PercentAtoM));
                    jsonWriter.WritePropertyName("n-z");
                    jsonWriter.WriteValue(DecimalToPercent(analysis.LastName.PercentNtoZ));
                    jsonWriter.WriteEndObject();
                    jsonWriter.WriteEndObject();

                    jsonWriter.WritePropertyName("state-population-top-10");
                    jsonWriter.WriteStartObject();
                    jsonWriter.WritePropertyName("total");
                    jsonWriter.WriteStartArray();
                    var top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.StatePercentages);
                    foreach (var state in top10)
                    {
                        jsonWriter.WriteStartObject();
                        jsonWriter.WritePropertyName("state");
                        jsonWriter.WriteValue(state.Key);
                        jsonWriter.WritePropertyName("pct");
                        jsonWriter.WriteValue(DecimalToPercent(state.Value));
                        jsonWriter.WriteEndObject();
                    }
                    jsonWriter.WriteEndArray();
                    jsonWriter.WritePropertyName("female");
                    jsonWriter.WriteStartArray();
                    top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.FemaleStatePercentages);
                    foreach (var state in top10)
                    {
                        jsonWriter.WriteStartObject();
                        jsonWriter.WritePropertyName("state");
                        jsonWriter.WriteValue(state.Key);
                        jsonWriter.WritePropertyName("pct");
                        jsonWriter.WriteValue(DecimalToPercent(state.Value));
                        jsonWriter.WriteEndObject();
                    }
                    jsonWriter.WriteEndArray();
                    jsonWriter.WritePropertyName("male");
                    jsonWriter.WriteStartArray();
                    top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.MaleStatePercentages);
                    foreach (var state in top10)
                    {
                        jsonWriter.WriteStartObject();
                        jsonWriter.WritePropertyName("state");
                        jsonWriter.WriteValue(state.Key);
                        jsonWriter.WritePropertyName("pct");
                        jsonWriter.WriteValue(DecimalToPercent(state.Value));
                        jsonWriter.WriteEndObject();
                    }
                    jsonWriter.WriteEndArray();
                    jsonWriter.WriteEndObject();

                    jsonWriter.WritePropertyName("age-ranges");
                    jsonWriter.WriteStartArray();
                    foreach (var ageRangePercentage in analysis.AgeRangePercentages)
                    {
                        jsonWriter.WriteStartObject();
                        jsonWriter.WritePropertyName("age");
                        jsonWriter.WriteValue(ageRangePercentage.Key);
                        jsonWriter.WritePropertyName("pct");
                        jsonWriter.WriteValue(DecimalToPercent(ageRangePercentage.Value));
                        jsonWriter.WriteEndObject();
                    }
                    jsonWriter.WriteEndArray();

                    jsonWriter.WritePropertyName("state-age-top-10");
                    jsonWriter.WriteStartArray();
                    top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.StateAverageAge);
                    foreach (var state in top10)
                    {
                        jsonWriter.WriteStartObject();
                        jsonWriter.WritePropertyName("state");
                        jsonWriter.WriteValue(state.Key);
                        jsonWriter.WritePropertyName("age");
                        jsonWriter.WriteValue(state.Value);
                        jsonWriter.WriteEndObject();
                    }
                    jsonWriter.WriteEndArray();

                    jsonWriter.WriteEndObject();
                    json = stringWriter.ToString();
                }
            return(json);
        }
Example #5
0
        public static string ToXml(UserAnalysisModel analysis)
        {
            var xml = string.Empty;

            using (var stringWriter = new StringWriter())
            {
                var xmlWriter = XmlWriter.Create(stringWriter);
                xmlWriter.WriteStartDocument();
                xmlWriter.WriteStartElement("useranalysis");

                xmlWriter.WriteStartElement("gender-pct");
                xmlWriter.WriteStartElement("female");
                xmlWriter.WriteString($"{FormatPercentage(analysis.Gender.PercentFemale)}");
                xmlWriter.WriteEndElement();
                xmlWriter.WriteStartElement("male");
                xmlWriter.WriteString($"{FormatPercentage(analysis.Gender.PercentMale)}");
                xmlWriter.WriteEndElement();
                xmlWriter.WriteEndElement();

                xmlWriter.WriteStartElement("name-initial-pct");
                xmlWriter.WriteStartElement("first-name");
                xmlWriter.WriteStartElement("a-m");
                xmlWriter.WriteString($"{FormatPercentage(analysis.FirstName.PercentAtoM)}");
                xmlWriter.WriteEndElement();
                xmlWriter.WriteStartElement("n-z");
                xmlWriter.WriteString($"{FormatPercentage(analysis.FirstName.PercentNtoZ)}");
                xmlWriter.WriteEndElement();
                xmlWriter.WriteEndElement();

                xmlWriter.WriteStartElement("last-name");
                xmlWriter.WriteStartElement("a-m");
                xmlWriter.WriteString($"{FormatPercentage(analysis.LastName.PercentAtoM)}");
                xmlWriter.WriteEndElement();
                xmlWriter.WriteStartElement("n-z");
                xmlWriter.WriteString($"{FormatPercentage(analysis.LastName.PercentNtoZ)}");
                xmlWriter.WriteEndElement();
                xmlWriter.WriteEndElement();
                xmlWriter.WriteEndElement();

                xmlWriter.WriteStartElement("state-population-top-10");
                xmlWriter.WriteStartElement("total");
                var top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.StatePercentages);
                foreach (var state in top10)
                {
                    xmlWriter.WriteStartElement("state");
                    xmlWriter.WriteStartElement("name");
                    xmlWriter.WriteString(state.Key);
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("pct");
                    xmlWriter.WriteString($"{FormatPercentage(state.Value)}");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteEndElement();
                }
                xmlWriter.WriteEndElement();
                xmlWriter.WriteStartElement("female");
                top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.FemaleStatePercentages);
                foreach (var state in top10)
                {
                    xmlWriter.WriteStartElement("state");
                    xmlWriter.WriteStartElement("name");
                    xmlWriter.WriteString(state.Key);
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("pct");
                    xmlWriter.WriteString($"{FormatPercentage(state.Value)}");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteEndElement();
                }
                xmlWriter.WriteEndElement();
                xmlWriter.WriteStartElement("male");
                top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.MaleStatePercentages);
                foreach (var state in top10)
                {
                    xmlWriter.WriteStartElement("state");
                    xmlWriter.WriteStartElement("name");
                    xmlWriter.WriteString(state.Key);
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("pct");
                    xmlWriter.WriteString($"{FormatPercentage(state.Value)}");
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteEndElement();
                }
                xmlWriter.WriteEndElement();
                xmlWriter.WriteEndElement();

                xmlWriter.WriteStartElement("age-ranges");
                foreach (var ageRangePercentage in analysis.AgeRangePercentages)
                {
                    xmlWriter.WriteStartElement($"age");
                    xmlWriter.WriteAttributeString("range", ageRangePercentage.Key);
                    xmlWriter.WriteString($"{FormatPercentage(ageRangePercentage.Value)}");
                    xmlWriter.WriteEndElement();
                }
                xmlWriter.WriteEndElement();


                xmlWriter.WriteStartElement("state-age-top-10");
                top10 = Utilities.GetTopSortedFromDictionary <string, decimal>(analysis.StateAverageAge);
                foreach (var state in top10)
                {
                    xmlWriter.WriteStartElement("state");
                    xmlWriter.WriteStartElement("name");
                    xmlWriter.WriteString(state.Key);
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("age");
                    xmlWriter.WriteString(state.Value.ToString());
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteEndElement();
                }
                xmlWriter.WriteEndElement();

                xmlWriter.WriteEndDocument();
                xmlWriter.Close();

                xml = stringWriter.ToString();
            }
            return(xml);
        }