clasificación en la lista genérica después de usar el método .Toarray

Estoy usando el siguiente código para vincular una fuente de datos paginada al control del repetidor

  protected void Paging()
    {
        Array q = (Array)Session["q"];
        PagedDataSource objPds = new PagedDataSource();
        objPds.DataSource = q;
        objPds.AllowPaging = true;
        objPds.PageSize = Convert.ToInt32(ddlPageNo.SelectedValue);

        objPds.CurrentPageIndex = CurrentPage;

        lblCurrentPage.Text = "Page: " + (CurrentPage + 1).ToString() + " of "
           + objPds.PageCount.ToString();

        // Disable Prev or Next buttons if necessary
        cmdPrev.Enabled = !objPds.IsFirstPage;
        cmdNext.Enabled = !objPds.IsLastPage;

        rptHotels.DataSource = objPds;
        rptHotels.DataBind();

    }

sin que importe q is

 getAvailableHotelResponse getres = new getAvailableHotelResponse();    
  getres = objsoap.getAvailableHotel(apiKey, destinationId, checkIn, checkOut, strCurrencyCode, "UK", false, rooms, f);   
            List<hotel> hr = new List<hotel>();
            hr = getres.availableHotels.ToList();

            List<BALHotelList> bh = new List<BALHotelList>();
            bh = h.GetHotelListByDestinationId(destinationId);
     var q = from a in bh
                    join b in hr on a.HotelCode equals b.hotelCode
                    orderby a.HotelName
                    select new
            {
                a.HotelCode,
                a.ImageURL_Text,
                a.HotelName,
                a.StarRating,
                a.HotelAddress,
                a.Destination,
                a.Country,
                a.HotelInfo,
                a.Latitude,
                a.Longitude,
                b.totalPrice,
                b.totalPriceSpecified,
                b.totalSalePrice,
                b.totalSalePriceSpecified,
                b.rooms

            };


            //rptHotels.DataSource = getres.availableHotels;

            Session["q"] = q.ToArray();

ahora quiero usar

desea ordenar la matriz q por hotelname or starRating .

No estoy encontrando ningún método como

q.sort(); 

or

q.orderBy(q->hotelName)

preguntado el 27 de julio de 12 a las 19:07

add using System.Linq; -

@TimSchmelter ya tengo este espacio de nombres incluido. -

3 Respuestas

Para una clasificación en el lugar de una matriz existente por un miembro:

Array.Sort(theArray, (x,y) => string.Compare(x.HotelName, y.HotelName));

Respondido 27 Jul 12, 19:07

usa lo siguiente..

q.OrderBy(x => x.HotelName);

ACTUALIZACIÓN

echando atrás de la sesión, hazlo así

//if you have concrete type instead of object, use that type

var t = (IEnumerable<object>)Session["q"];

ACTUALIZACIÓN 2

su proyección debe ser de un tipo concreto (es decir, cree una nueva clase de hotel para representar su proyección); de lo contrario, no podrá realizar OrderBy en alguna propiedad de su proyección.

Respondido 27 Jul 12, 21:07

Creo que debería ser: q.OrderBy(result -> result.HotelName); ... no necesitas ToList() - Resumen

@Anand no aparece el método OrderBy en q - raulyansharma

@Anand sysem.array no contiene una definición para OrderBy - raulyansharma

mira esto msdn.microsoft.com/en-us/library/bb534966.aspx. Es un método de extensión en la clase Enumerable. Debe estar allí. Array también es Enumerable - Anand

Necesita el ensamblado System.Core y el espacio de nombres System.Linq - Anand

q para ti es un ejemplo de la Array clase, en lugar de una matriz de algún tipo (es decir, int[], string[], object[]). Array solo implementos IEnumerableno, IEnumerable<T> entonces los métodos Linq no están allí. El problema subyacente aquí es que se trata de una matriz de un tipo anónimo, por lo que, aparte de usar soluciones realmente desordenadas, no puede recuperar de manera efectiva una matriz fuertemente tipada.

La mejor solución en este punto es crear una nueva clase para almacenar sus datos (es decir, Hotel) en lugar de ponerlo en un tipo anónimo. Cuando complete la sesión, cree nuevas instancias de ese tipo (Hotel), y luego, cuando lo saque de la sesión, cámbielo a una matriz de ese tipo (Hotel[]), en lugar del genérico Array. En ese momento, podrá utilizar los métodos de Linq en el objeto.

Respondido 27 Jul 12, 20:07

Ya estoy usando dos clases, una es BALHotel y Hotel y q es el resultado de la combinación interna de dos objetos de clases. y no creo que sea un buen enfoque para crear una nueva clase que solo contenga el resultado de la unión interna del objeto de dos clases. ¿Es el enfoque correcto? - raulyansharma

Si ya tienes un Hotel class, entonces necesitará usar un nombre diferente, pero casi seguramente querrá crear una nueva clase concreta para esto. Los tipos anónimos están diseñados para usarse dentro del alcance de un solo cuerpo de método y no persisten entre métodos. Crear una nueva clase concreta será el camino de menor resistencia aquí. - Servir

sí, ese es el problema real es que var solo se usa con el método in, no podemos declarar var como global. - raulyansharma

¿Debo crear una clase separada para cada resultado cuando aplico este tipo de unión? - raulyansharma

@rahularyansharma Si solo va a usar el resultado dentro del alcance de un solo método, no, no hay necesidad. Cuando desee devolver los resultados o almacenarlos en un campo para que se pueda acceder a ellos en otro lugar, entonces sí, querrá crear una clase concreta. - Servir

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.