【问题标题】:How to use dynamic OrderBy variable with anonymous type?如何使用匿名类型的动态 OrderBy 变量?
【发布时间】:2011-11-24 04:32:06
【问题描述】:

我有几个网站并在主页上加载文章。我可以设置文章的排名以不同的顺序显示它们,但文章的各个站点上的排序可能不同。

我必须订购文章的代码为所有网站设置相同的顺序:

    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)?

提前致谢。

【问题讨论】:

    标签: c# linq dynamic .net-3.5


    【解决方案1】:

    假设您有一组固定的位置(根据定义,您必须在匿名类型中声明它们),那么您可以只使用一个开关:

    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 调用,但由于匿名类型,您不能在此处执行此操作。

    【讨论】:

      猜你喜欢
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      相关资源
      最近更新 更多