using System.Collections.Generic;
public static class Program
private const string CsvData = @"name,state,ClosetSize,childGender
public static void Main()
private static void Process(string inputData)
IReadOnlyCollection<SourceRecord> input = SourceRecord.Parse(inputData);
IEnumerable<OutputRecord> output = input
.GroupBy(r => new { r.name, r.state })
.Where(g => g.Any(r => r.childGender == 'M') && g.Any(r => r.childGender == 'F'))
.Select(g => new OutputRecord
ClosetSize = g.Sum(r => r.ClosetSize),
OutputRecord.Save(Console.Out, output);
public string name { get; set; }
public string state { get; set; }
public int ClosetSize { get; set; }
public char childGender { get; set; }
public static IReadOnlyCollection<SourceRecord> Load(TextReader reader)
var csv = new CsvReader(reader);
return csv.GetRecords<SourceRecord>().ToList();
public static IReadOnlyCollection<SourceRecord> LoadFrom(string fileName)
using (var reader = File.OpenText(fileName))
public static IReadOnlyCollection<SourceRecord> Parse(string input)
using (var reader = new StringReader(input))
public string name { get; set; }
public string state { get; set; }
public int ClosetSize { get; set; }
public static void Save(TextWriter writer, IEnumerable<OutputRecord> records)
var csv = new CsvWriter(writer);
csv.WriteRecords(records);
public static void SaveTo(string fileName, IEnumerable<OutputRecord> records)
using (var writer = new StreamWriter(fileName))