0

Issue trying to pass coordinates in to a multidimensional array. Errors thrown:

(1) at var newArray = item.To2dArray(); in GetInstructions() method:

List does not contain a definition for To2dArray and no extensible method To2dArray accepting a first argument of type ist

(2) at public partial class SiteMaster : MasterPage when the method public static Coords[,] To2dArray(this List<List<Coords>> list) is added

Extension method must be defined in non-generic static class

My list structure

    public class Route
    {
        public string status_message { get; set; }
        public string route_geometry { get; set; }
        public int status { get; set; }
        //route_instructions is what I'm interested in
        public List<List<object>> route_instructions { get; set; }
    }

    public class Coords
    {
        public int Lat { get; set; }
        public int Lon { get; set; }
        public Coords(string a, string b)
        {
            this.Lat = Convert.ToInt32(a);
            this.Lon = Convert.ToInt32(b);
        }
    }
    List<Coords> Coordinates = new List<Coords>();

Code to deserialise JSON

    private void GetInstructions()
    {
            string strurltest = String.Format("https://developers.onemap.sg/privateapi/routingsvc/route?start="+
                        startLat+","+ startLon +"&end="+ destinationLat +","+ destinationLon+"&"+
                        "routeType="+ transportType + "&token="+token);
            WebRequest requestObjGet = WebRequest.Create(strurltest);
            requestObjGet.Method = "GET";
            HttpWebResponse responseObjGet = null;
            responseObjGet = (HttpWebResponse)requestObjGet.GetResponse();
            string strresulttest = null;
            using (Stream stream = responseObjGet.GetResponseStream())
            {
                StreamReader sr = new StreamReader(stream);
                strresulttest = sr.ReadToEnd();
                sr.Close();
            }

            Route route = new JavaScriptSerializer().Deserialize<Route>(strresulttest);
            route_geometry = route.route_geometry;
            //display route instructions

            foreach (var item in route.route_instructions)
            {
                var newArray = item.To2dArray();
                System.Diagnostics.Debug.WriteLine(item[3]);
                TextBox3.Text = TextBox3.Text + Environment.NewLine + item[9];
            }

        }

Code to convert list object to multidimensional array

public static Coords[,] To2dArray(this List<List<Coords>> list)
    {
        if (list.Count == 0 || list[0].Count == 0)
            throw new ArgumentException("The list must have non-zero dimensions.");

        var result = new Coords[list.Count, list[0].Count];
        for (int i = 0; i < list.Count; i++)
        {
            for (int j = 0; j < list[i].Count; j++)
            {
                if (list[i].Count != list[0].Count)
                    throw new InvalidOperationException("The list cannot contain elements (lists) of different sizes.");
                result[i, j] = list[i][j];
            }
        }

        return result;
    }

List object when printed is in this format: (when System.Diagnostics.Debug.WriteLine(item[3]); in GetInstructions()

1.315396,103.764419
1.314333,103.763455
1.312906,103.766496
1.312109,103.772234
1
  • have you stepped through this to identify the problem ? Commented Oct 28, 2019 at 6:30

1 Answer 1

1

You can only use a Method as Extension, if it is static and in an static class. Your method To2dArray must be moved to an extra static class. This is what the following message means:

Extension method must be defined in non-generic static class

The other problem is, that the signature of the method does not fit: You are iterating through route.route_instructions so item is of type List<object> but your method needs List<List<Coords>>

foreach (var item in route.route_instructions)
{
      var newArray = item.To2dArray();
///...
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.