 <p>Try to group your data by station name, then select observation having maximum date from each group. This linq query should work :</p> <pre><code>var stations = from item in weatherData.Descendants("Observation") group item by (string) item.Element("Station") into g let date = g.Max(o =&gt; DateTime.Parse((string)o.Element("DateTime"))) select new { Name = g.Key, MostRecentDate = date, LastTemperature = Decimal.Parse((string)g.FirstOrDefault(o =&gt; date == DateTime.Parse((string)o.Element("DateTime"))).Element("Temperature")) }; </code></pre> <p>But this way is more readable :</p> <pre><code>var query = from item in weatherData.Descendants("Observation") group item by (string) item.Element("Station") into g select g; var stations = new List&lt;Station&gt;(); foreach (var q in query) { //maximum date in current group var maxDate = q.Max(o =&gt; DateTime.Parse((string) o.Element("DateTime"))); //1st observation having date equal maximum date var latestObservation = q.FirstOrDefault(o =&gt; DateTime.Parse((string) o.Element("DateTime")) == maxDate); //create new Station using data from latest observation var newStation = new Station(); newStation.Name = q.Key; newStation.MostRecentDate = maxDate; newStation.LastTemperature = Decimal.Parse((string)latestObservation.Element("Temperature")); //add newly created Station to result list stations.Add(newStation); } </code></pre>