Verify if meeting datetime ranges overlap in an IEnumerable list of meetings
Sorting is what actually makes it work but if you also want it to be more linq-ish and more solid then you should change the following things:


move the overlap-logic into another method
change the method to return an IEnumerable&lt;Meeting[]&gt; for meetings that overlap 
use Any to find out whether any meeting overlap
make both methods extensions


Example:

public static IEnumerable&lt;Meeting[]&gt; Overlappings(this IEnumerable&lt;Meeting&gt; meetings)
{
    var last = (Meeting)null;
    foreach (var meeting in meetings.OrderBy(m =&gt; m.Start))
    {
        if (last != null &amp;&amp; meeting.OverlapsWith(last))
        {
            yield return new [] { last, meeting };
        }
        last = meeting;
    }
}

public static bool OverlapsWith(this Meeting x, Meeting y) 
{
    return x.Start &lt; y.Start ? x.End &gt; y.Start : y.End &gt; x.Start;
}


Gets overlapping meetings:

var overlappingMeetings = meetings.Overlappings();


or checks if there are any. It stops at the first overlapping pair found:

var meetingsOverlap = meetings.Overlappings().Any();


with these new extensions you are more flexible because you can easily check any two meetings overlap and it's easier to undestand than DoesNotOverlap. Usually it's better to write positive conditions and negate them if necessary rather than the other way around.



But even this could be further improved by overloading the two &lt; and &gt; operators:

public static bool operator &lt;(Meeting x, Meeting y) 
{
    return x.End &lt; y.Start;
}

public static bool operator &gt;(Meeting x, Meeting y)
{
    return x.End &gt; y.Start;
}


and making the OverlapsWith method still more natural:

public static bool OverlapsWith(this Meeting x, Meeting y) 
{
    return x.Start &lt; y.Start ? x &lt; y : y &gt; x;
}