在匿名类型中按日期属性排序对象的好方法?

时间:2011-12-06 05:34:02

标签: c#

我有以下代码:

var resultArticles = from a in articleItems 

select new
{
   Title = a.Title, 
   ArticleDate = a[Constants.FieldNames.ArticleStartDate] != null ?
     ((DateTime)a[Constants.FieldNames.ArticleStartDate]).ToString(Constants.Date.Format): string.Empty,
   ByLine = a[Constants.FieldNames.Byline],
   FileRef = SPUtility.ConcatUrls(web.Url, a.Url)
};

var sortedArticles = resultArticles.OrderBy(a => a.ArticleDate).ToList();

rptArticles.DataSource = sortedArticles;
rptArticles.DataBind();

我想在这里必须有更好的方法来排序/订购,因为如果我有日期(年/月/日)

12.01.2011
11.02.2011
10.02.2011
13.01.2011
08.02.2011

它只按天排序,不考虑月份,因此sortedArticles的结果如下:

08.01.2011
10.02.2011
11.02.2011
12.01.2011
13.01.2011

我显然想先显示最新文章,即11.02.2011

有什么建议吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

问题是,在您的选择中,您在日期字段上调用了ToString。因此,ArticleDate将被投射为字符串。这就是它没有正确排序的原因。

将ArticleDate投射为可以为空的日期可能是您最好的选择

var resultArticles = from a in articleItems 
select new
{
   Title = a.Title, 
   ArticleDate = a[Constants.FieldNames.ArticleStartDate] != null ?
     ((DateTime)a[Constants.FieldNames.ArticleStartDate]) : default(DateTime?),
   ByLine = a[Constants.FieldNames.Byline],
   FileRef = SPUtility.ConcatUrls(web.Url, a.Url)
};

此外,对于这样简单的事情,您可以使用更简洁的“点符号”

var resultArticles = articleItems.Select(a => new { 
   Title = a.Title, 
   ArticleDate = a[Constants.FieldNames.ArticleStartDate] != null ?
     ((DateTime)a[Constants.FieldNames.ArticleStartDate]) : default(DateTime?),
   ByLine = a[Constants.FieldNames.Byline],
   FileRef = SPUtility.ConcatUrls(web.Url, a.Url)
};

此时您可以按ArticleDate对此集合进行排序,该日期将存储为真实日期,而不是字符串

resultArticles.OrderBy(a => a.ArticleDate).ToList();

答案 1 :(得分:0)

使用以下语法

var q = from el in dataSource orderby el.SortField select new { 
    //your projection
};

这里的要点是在一次查询中进行选择时进行排序。

修改

通过使用此语句,您可以按实际DateTime和项目字符串表示形式进行排序。