Finding correct format? Arrays and Modulation
Here's how I would do it. 

Update: I included a description of my code this time based on comments. 

First, reading a file into a variable so that each line of the file is its own element in an array is super easy with File.ReadAllLines(...). But I don't feel like using a variable for that is necessary here, so I immediately start using the array by using the Select(...) method. I'm using Select here to create an anonymous type (That's the return new { ... } part). 

var data = File.ReadAllLines(@"c:\temp\data.txt").Select (f =&gt; 
{
    var split = f.Split(',');
    return new { 
        Age = int.Parse(split[0]),
        District = split[3]
    };
});


At this point, I've got a type-safe collection of "data" that I can work with. That's important, and very useful.  For example.. 

var byDistrict = data.GroupBy (d =&gt; d.District);


In the line above, I've grouped the data by District. Grouping is, in my opinion, almost always better than using Distinct. 

The rest of the code is very similar to your original code, except my code avoids the need to have the age reports within a loop. 

foreach (var district in byDistrict)
{
    Console.WriteLine("District {0} has {1} resident(s)", district.Key, district.Count());

}

Console.WriteLine("Ages 0-18 : {0} resident(s)", data.Count(x =&gt; x.Age &lt; 18));
Console.WriteLine("Ages 18-30 : {0} resident(s)", data.Count(x =&gt; x.Age &gt;= 18 &amp;&amp; x.Age &lt;= 30));
Console.WriteLine("Ages 31-45 : {0} resident(s)", data.Count(x =&gt; x.Age &gt;= 31 &amp;&amp; x.Age &lt;= 45));
Console.WriteLine("Ages 46-64 : {0} resident(s)", data.Count(x =&gt; x.Age &gt;= 46 &amp;&amp; x.Age &lt;= 64));
Console.WriteLine("Ages &gt;=65 : {0} resident(s)", data.Count(x =&gt; x.Age &gt;= 65));