2012-07-27 91 views
3

我使用下面的代码后泛型列表排序上绑定一个分页数据源到中继器控制使用.Toarray方法

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) 
+1

add'using System.Linq;' – 2012-07-27 18:47:08

+0

@TimSchmelter我已经有了这个命名空间。 – rahularyansharma 2012-07-27 18:48:45

回答

1

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

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

+0

我已经使用了两个班,一个是BALHotel和Hotel,q是两个班对象的内部连接结果。我不认为这将是一个很好的方法来创建一个新的类,它只是持有两个类对象内连接的结果。这是正确的方法吗? – rahularyansharma 2012-07-27 19:36:26

+0

如果你已经有了一个'Hotel'类,那么你需要使用一个不同的名字,但是你几乎肯定希望为此创建一个新的具体类。匿名类型被设计为在单个方法体的范围内使用,而不是在方法之间持久化。创建一个新的具体课程将成为阻力最小的路径。 – Servy 2012-07-27 19:38:51

+0

是的,这就是实际的问题是var仅用于in方法中,我们不能将var声明为全局变量。 – rahularyansharma 2012-07-27 19:40:34

2

对于就地排序现有阵列的由一个构件:

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

使用以下。 。

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

UPDATE

铸造从会议回来,像这样做

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

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

更新2

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

+2

我相信它应该是:'q.OrderBy(result - > result.HotelName);'...你不需要'ToList()' – IAbstract 2012-07-27 18:59:53

+0

yes checked。没有toList的要求。编辑它以反映 – Anand 2012-07-27 19:02:21

+0

@And并且没有出现方法OrderBy on q – rahularyansharma 2012-07-27 19:04:44

相关问题