Seems simple enough:
var connectElements = xdoc.Descendants("List").Descendants("Connect");
var groupedElements = from el in connectElements
group el by el.Attribute("ID").Value into g
select g;
foreach (IGrouping<string, XElement> group in groupedElements)
{
var telephoneNumbers = new HashSet<string>(group.Select(el => el.Attribute("PhoneNumber").Value), StringComparer.Ordinal);
if (telephoneNumbers.Count == 1)
{
Console.WriteLine("{0}: All numbers match.", group.Key);
}
else
{
Console.WriteLine("{0}: Found {1} different numbers.", group.Key, telephoneNumbers.Count);
}
}
Output:
ID1: All numbers match.
ID2: Found 2 different numbers.
ID3: Found 3 different numbers.
ID4: All numbers match.