Re: Какой код проще, лучше и почему
От: sashar2  
Дата: 04.04.10 06:16
Оценка: -3
Здравствуйте, 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);
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.