如何使用Lambda表达式格式化日期

时间:2011-10-13 01:38:08

标签: c#

Lambda新手。这个问题特别针对Lambda表达式来操纵日期格式。以下代码用于从调度程序系统获取所有提醒:

MyReminders = ScheduledActionService.GetActions().Where(
    a => a.BeginTime.Date == Today
);
  1. 可以在返回结果集之前更改日期格式。

    .where (
        a => a.BeginTime.Date == Today).Select(
            //the date and format
            BeginTime.date.ToString("d", new cultureInfo("zh-CN")) 
    )
    
  2. 按如下所示更改日期格式,但这是否适用于lambda表达式?

    BeginTime.Date.ToString("d",new cultureInfo("zh-CN"), 
    
  3. 感谢您的帮助。

    ------------更新:

    我尝试了这两种方法。 ListBox中没有显示结果:

    此调度程序系统适用于Windows Phone 7.此提醒对象包含以下属性: 1)BeginTime,2)ExpirationTime,3)Title,4)Content,5)isSchedule and ohers

    检索后,我需要DataBind它到ListBox。 ReminderListBox.ItemsSource = MyReminders;

    1) var czech = new CultureInfo("zh-CN");

            var MyReminders = ScheduledActionService.GetActions<Reminder>()
                .Where(a => a.BeginTime.Date == Today)
                .Select(a =>
                new
                {
                 Begindate = a.BeginTime.Date.ToString("d", czech),
                 Title = a.Title,
                 Content = a.Content
                });
    

    var MyReminders = ScheduledActionService.GetActions<Reminder>() .Where(a => a.BeginTime.Date == Today) .Select(a => new { Begindate = a.BeginTime.Date.ToString("d", czech), Title = a.Title, Content = a.Content });

    2) var czech = new CultureInfo("zh-CN"); var MyReminders = ScheduledActionService.GetActions() .Where(a => a.BeginTime.Date == Today) .Select(a => a.BeginTime.Date.ToString("d", czech));

    
    
    

2 个答案:

答案 0 :(得分:1)

您可以选择Where中传递谓词的项目,您可以项目划分为不同类型的序列,但您可以(应该)不更改序列中的项目。

var results = yourSequence.Where(yourPredicate)
                          .Select(item => item.BeginDate.ToString("yourformat"));

在此示例中,lambda是Func<YourType, string>,其中YourType是序列中元素的类型,string是表达式的输出。也就是说,它会在左侧YourType上输入(item =>)并在右侧string上生成输出(item.BeginDate.ToString())。

这将为您提供IEnumerable<string>,其中包含您选择的字符串格式的BeginDate值。或者,您可以投射到另一种类型

var results = yourSequence.Select(item => 
           new 
           { 
               DateString = item.BeginDate.ToString("yourformat"),
               Foo = item.Foo,
               Bar = item.Bar
           });

这会为您提供IEnumerable<AnonymousType>,然后您可以循环访问DateStringFooBar属性。当然,lambda将代表Func<YourType, AnonymousType>

答案 1 :(得分:1)

我认为你不太了解lambda是什么。在它的核心,一个lambda与(在你的情况下)

完全相同
delegate bool FilterMyObject(MyObject)

bool WhereToday(MyObject obj) {
  return obj.BeginTime.Date == Today
}

....

 MyReminders = ScheduledActionService.GetActions().Where(new FilterMyObject(whereToday))

它将编译为非常相似的东西(除了它将使用泛型委托Func)。

现在,如果您使用的是Linq2Sql或参数类型为Expression<Func<T,bool>>的其他内容,则可以添加一个步骤,其中实现该方法的人员有机会检查您尝试执行的操作(以及通常会优化它。)

要回答你的问题,你可能想要

var czech = new CultureInfo("zh-CN");
var MyReminders = ScheduledActionService.GetActions()
                .Where(a => a.BeginTime.Date == Today);
                .Select(a => a.BeginTime.Date.ToString("d",czech)
                .ToArray();

将输出格式化字符串数组