Здравствуйте, Ikemefula.
С extensions и/или LINQ синтаксисом вариант в плане читаемости проигрывает. В данном случае можно обойтись foreach. Возможно, стоит части кода вынести в отдельные методы, которые стоит назвать по их смыслу. Ниже приведу пример (только пример

) :
private void Collect(IService sr, ObjectCategories protection)
{
foreach (NetworkConnection networkConnection in GetServiceConnections(sr))
Collect(networkConnection, protection);
}
private IEnumerable<NetworkConnection> GetServiceConnections(IService service)
{
List<NetworkConnection> networkConnections = new List<NetworkConnection>();
foreach (ServiceSegment segment in GetServiceSegments(service))
foreach (NetworkConnection networkConnection in GetSegmentConnections(segment))
networkConnections.Add(networkConnection);
return networkConnections;
}
private IEnumerable<ServiceSegment> GetServiceSegments(IService service)
{
List<ServiceSegment> segments = new List<ServiceSegment>();
foreach (ServiceSegment item in service.WorkingSegments)
segments.Add(item);
foreach (ServiceSegment item in service.ProtectionSegments)
segments.Add(item);
return segments;
}
private IEnumerable<NetworkConnection> GetSegmentConnections(ServiceSegment segment)
{
List<NetworkConnection> networkConnections = new List<NetworkConnection>();
foreach (SegmentParcel parcel in segment.SegmentParcels)
if (parcel.NetworkConnection != null)
networkConnections.Add(parcel.NetworkConnection);
return networkConnections;
}
Можно частично перенести на linq extensions:
private void Collect(IService sr, ObjectCategories protection)
{
foreach (NetworkConnection networkConnection in GetServiceConnections(sr))
Collect(networkConnection, protection);
}
private IEnumerable<ServiceSegment> GetServiceSegments(IService service)
{
return Enumerable.Concat(service.WorkingSegments, service.ProtectionSegments);
}
private IEnumerable<NetworkConnection> GetServiceConnections(IService service)
{
return GetServiceSegments(service).SelectMany(s => GetSegmentConnections(s));
}
private IEnumerable<NetworkConnection> GetSegmentConnections(ServiceSegment segment)
{
return segment.SegmentParcels.Select(s => s.NetworkConnection).Where(s => s != null);
}