Размещение методов в цикле foreach c # - PullRequest
0 голосов
/ 23 января 2011

не уверен, что заголовок действительно правильный, но это проблема ...

У меня есть цикл foreach, заполняющий коллекцию меток. Мне нужно сделать некоторую «работу» над одним из элементов XML (Локатор). «работа» закомментирована. Проблема в том, что я не вижу, куда поместить эти задачи / переменные в любом месте. куда бы я ни положил, я получаю множество ошибок. Я могу вдаваться в подробности, если это необходимо, но мне интересно, есть ли лучший способ сделать это. Это объяснение ниже того, что я пытаюсь сделать, но дайте мне знать, если вам нужно больше объяснений. Любые предложения приветствуются.

  public void OnOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    { 
        var document = XDocument.Load(e.Result);
        if (document.Root == null)
            return;
         var events = from ev in document.Descendants("item")

                      .Where(ev => ev.Element("category") != null)

                     select new 
                     {

                         Title = (ev.Element("title").Value),
                         Description = (ev.Element("description").Value),
                         Category = (ev.Element("category").Value),
                         Latitude = (ev.Element("link").Value),

                      };


         ObservableCollection<Eng> pushPinCollection = new ObservableCollection<Eng>();

        foreach (var ev in events)
         {

             Eng PushPin = new Eng
               (ev.Title, ev.Description, ev.Category)

           // Lat1 = (ev.Latitude),
            //  var items = Lat1.Split('?')[1].Split('&').Select(i => i.Split  ('=')).ToDictionary(o => o[0], o => o[1]); 
            //  var lon = items["lon"]; 
            //  var lat = items["lat"];
            //  var lat1 = Convert.ToDouble(lat);
            //  var lon1 = Convert.ToDouble(lon);
             {

        //Location value below is System.Device.location.Geocoordinate Eng Location
                  Location = new GeoCoordinate(lat1, lon1),
                  Title = ev.Title,
                  Description = ev.Description,
                  Category = ev.Category

             };
            pushPinCollection.Add(PushPin);
         }
         pushPins = pushPinCollection;
         mapItems.ItemsSource = PushPins;

       }

Ответы [ 2 ]

1 голос
/ 23 января 2011

Вы не можете вставить какой-либо код между завершением вызова Конструктора и инициализатором. Есть несколько способов решить эту проблему:

Eng pushPin = new Eng(...);  // note the semicolon

// calculations to get lat1 and lon1

pushPin.Location = new GeoCoordinate(lat1, lon1); // Location must have a public Set

или

// calculations for lat1 and lon 1

Eng PushPin = new Eng(ev.Title, ev.Description, ev.Category)
                  {
                      Location = new GeoCoordinate(lat1, lon1);
                  }

или если у вас есть конструктор, который принимает GeoCoordinate:

 Eng PushPin = new Eng(ev.Title, ev.Description, ev.Category, new GeoCoordinate(lat1, lon1));
1 голос
/ 23 января 2011

Вообще говоря ... вы должны объявлять переменные в максимально узкой области видимости. Однако, если вы будете обращаться к переменным вне цикла For Loop, вам необходимо объявить их вне цикла For Loop. Вероятно, чуть выше строки «foreach (var ev in events)» должно быть Ok.

...