2011-11-24 82 views
0

我在主頁上有幾個網站和加載文章。我可以在文章上設置排名,以不同的順序顯示它們,但排序可能會因文章而異。如何使用具有匿名類型的動態OrderBy變量?

我有權責令文章中的代碼設置的所有網站相同的順序:

string officeLocation = ""; 
    // office location could be either World, Europe, Africa, America, Asia, Pacific 

    var result = articles.Select(a => new 
    { 
     Title = a.Title, 
     Url = a[SPBuiltInFieldId.FileRef], 
     Byline = a[Constants.FieldNames.Byline], 
     ArticleDate = a[Constants.FieldNames.ArticleStartDate], 
     RankWorld = a[Constants.FieldNames.World], 
     RankEurope = a[Constants.FieldNames.RankEurope], 
     RankAfrica = a[Constants.FieldNames.RankAfrica], 
     RankAmerica = a[Constants.FieldNames.RankAmerica], 
     RankAsia = a[Constants.FieldNames.RankAsia], 
     RankPacific = a[Constants.FieldNames.RankPacific], 
    }); 

    rptArticles.DataSource = result.OrderBy(a => a.RankWorld); 
    rptArticles.DataBind(); 

代碼設置的所有排名以任何RankWorld爲(1-6)。

如果字符串officeLocation(即傳遞給方法)是歐洲,那麼我想通過a.RankEurope訂購,如果officeLocation是亞洲訂單a.RankAsia等等。

我該如何最好的實現這個(.NET 3.5)?

在此先感謝。

回答

2

假設你有一個固定的位置(根據定義,你當你是在匿名類型,說明他們必須具備),那麼你可以只使用一個開關:

string officeLocation = ""; 
// office location could be either World, Europe, Africa, America, Asia, Pacific 

var result = articles.Select(a => new 
{ 
    Title = a.Title, 
    Url = a[SPBuiltInFieldId.FileRef], 
    Byline = a[Constants.FieldNames.Byline], 
    ArticleDate = a[Constants.FieldNames.ArticleStartDate], 
    RankWorld = a[Constants.FieldNames.World], 
    RankEurope = a[Constants.FieldNames.RankEurope], 
    RankAfrica = a[Constants.FieldNames.RankAfrica], 
    RankAmerica = a[Constants.FieldNames.RankAmerica], 
    RankAsia = a[Constants.FieldNames.RankAsia], 
    RankPacific = a[Constants.FieldNames.RankPacific], 
}); 

switch (officeLocation) 
{ 
    case "World": result = result.OrderBy(a => a.RankWorld); break; 
    case "Europe": result = result.OrderBy(a => a.RankEurope); break; 
    case "Africa": result = result.OrderBy(a => a.RankAfrica); break; 
    case "America": result = result.OrderBy(a => a.RankAmerica); break; 
    case "Asia": result = result.OrderBy(a => a.RankAsia); break; 
    case "Pacific": result = result.OrderBy(a => a.RankPacific); break; 
    default: throw new Exception("Unexpected location: " + officeLocation); 
} 

rptArticles.DataSource = result.OrderBy(a => a.RankWorld); 
rptArticles.DataBind(); 

很顯然,你需要決定如何最好地處理意外的位置。即,理想情況下,我剛剛分配OrderBy功能的Func<T,R>,但只有有一個OrderBy電話,但你不能這樣做,在這裏,由於匿名類型

注意。

+0

謝謝,我也加了這個開關,既然它起作用了,我把你的答案標記爲接受。 – user997685