0

The code-line looks like this:

ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] != null ? 
DateTime.Parse(item[BuiltInFieldId.ActiveEndDate].ToString()) : (DateTime?)null

How can I make sure that if item[BuiltInFieldId.ActiveEndDate] is not null declare it else dont declare anything to the ActiveEndDate variable, not even null.

It has to be during a object initialization

This is the surrounding code that was requested:

      var result = new Xannounce
                {

                    MyX = (
                        from item in items.Cast<SPListItem>()
                        from ta in (item[FieldId.x] as string ?? "").Replace(";", string.Empty).Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                        where audienceIds.Select(x => x.xID).Contains(ta)
                        select new Xannounce
                            {
                                Xid = item.ID,
                                Xpub = item[BuiltInFieldId.ResponsiblePublisher] as string ?? string.Empty,
                                XformUrl = item.ParentList.DefaultEditFormUrl,
                                ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] != null ? DateTime.Parse(item[BuiltInFieldId.ActiveEndDate].ToString()) : (DateTime?)null,
                                ActiveStartDate = item[BuiltInFieldId.ActiveStartDate] != null ? DateTime.Parse(item[BuiltInFieldId.ActiveStartDate].ToString()) : (DateTime?)null,
                                XEndDate = item[BuiltInFieldId.EndDate] != null ? DateTime.Parse(item[BuiltInFieldId.EndDate].ToString()) : (DateTime?)null,
                                XStartDate = item[BuiltInFieldId.StartDate] != null ? DateTime.Parse(item[BuiltInFieldId.StartDate].ToString()) : (DateTime?)null,
                                XTitle = item[SPBuiltInFieldId.Title].ToString(),
                                XMessage = item[SPBuiltInFieldId.Body] != null ? item[SPBuiltInFieldId.Body].ToString() : string.Empty,
                                Xtype = new SPFieldLookupValue(item[BuiltInFieldId.AnnouncementType].ToString()).LookupId,
                                XAuthor = item[SPBuiltInFieldId.Author].ToString(),
                                XAudienceNames = AudienceUtility.FindAudiences(item[FieldId.AudienceTargeting].ToString(), SPServiceContext.Current).Select(y => ' ' + y.AudienceName).ToArray()
                            }),
// Code continues...

Any kind of help or tips is appreciated alot

4

3 回答 3

5

不使用三元运算符怎么样?

if(item[BuiltInFieldId.ActiveEndDate] != null){
          ActiveEndDate =  item[BuiltInFieldId.ActiveEndDate];
}
于 2013-06-17T14:56:30.883 回答
3

您可以将其分配ActiveEndDate回自身,只要您的财产没有附加任何奇怪的副作用,其结果将与什么都不做相同。此外,通读您的代码,您调用 .ToString() 只是为了重新解析它。这似乎是个坏主意。如果表达式已经是日期时间,请使用它。如果不是,请不要调用 .ToString()。假设它是 DateTime,您现有的代码将简化为:

ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] ?? ActiveEndDate;

如果是别的东西,你可以这样做:

ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] != null ? DateTime.Parse(item[BuiltInFieldId.ActiveEndDate].ToString()) : ActiveEndDate;

您可能会发现有用的最后一点语法是default关键字:

ActiveEndDate = item[BuiltInFieldId.ActiveEndDate] ?? default(DateTime);

请注意,DateTime 表达式(不是 DateTime?)的默认值是1/1/1900. a 的默认值为DateTime?空。

我还没有涉及的另一个皱纹是DBNull。如果您的item变量是某种类型的 IDataRecord(SqlDataReader、DataRow 等),您可能正在处理DBNull's,这可能会给我的其他选项带来麻烦。这也可以解释为什么你在这里调用 .ToString() ,因为 .ToString() 以比其他一些选项更理智的方式处理 DBNull。无论如何,如果您在数据库中有一个字符串类型(如 varchar),那就太好了,但在处理日期和数字等其他类型时,当您实际有一个值时(希望更常见)情况,它仍然是倒退的。

在这种情况下,我建议先检查一个简单的if () {}块,正如另一个答案中已经发布的那样。如果您正在进行对象初始化(如对另一个答案的评论所建议的那样),事情就会开始变得复杂。现在我们有很多逻辑必须全部放入单个表达式中,以处理 、 和值的null情况DBNull。如果这是你的情况,我会用这个:

ActiveEndDate = (item[BuiltInFieldId.ActiveEndDate] == DBNull.Value?null:item[BuiltInFieldId.ActiveEndDate]) ?? ActiveEndDate
于 2013-06-17T15:00:53.037 回答
0

将三元组展开为 if 语句:

if (item[BuiltInFieldId.ActiveEndDate] != null) {
  ActiveEndDate = item[BuiltInFieldId.ActiveEndDate];
}

无论如何,肯定ActiveEndDate会默认为 DateTime.MinValue ( ) 。1/1/0001 12:00:00 AM

于 2013-06-17T14:58:37.943 回答