使用.Toarray方法后在通用列表上排序

时间:2012-07-27 18:43:49

标签: c# asp.net arrays sorting

我使用以下代码将分页数据源绑定到转发器控件

  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();

    }

其中q

 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();

现在我想用

希望按hotelnamestarRating对数组q进行排序。

我找不到像

这样的方法
q.sort(); 

q.orderBy(q->hotelName)

3 个答案:

答案 0 :(得分:2)

对于成员对现有数组的就地排序:

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

答案 1 :(得分:2)

使用以下..

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

<强>更新

从会话中退回,按照这样做

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

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

更新2

您的预测应该是具体类型(即创建一个新的酒店类来表示您的投影),否则您将无法对投影的某些属性执行OrderBy

答案 2 :(得分:1)

q对您来说是Array类的实例,而不是某种类型的数组(即int[]string[]object[])。 Array仅实现IEnumerable,而不是IEnumerable<T>,因此Linq方法不存在。这里的根本问题是它是一个匿名类型的数组,所以除了通过使用非常混乱的变通方法之外,你无法有效地获得强类型数组。

此时的最佳解决方案是创建一个新类来保存您的数据(即Hotel),而不是将其置于匿名类型中。当您填充会话时,创建该类型的新实例(Hotel),然后当您将其拉出会话时,将其转换为该类型的数组(Hotel[]),而不是通用{ {1}}。此时,您将能够在对象上使用Linq方法。