问题 三元问题

豆镇

成员
已加入
2019年2月15日
留言内容
15
编程经验
5-10
这是设置可为空的DateTime的最佳方法吗?对于我有今天或明天的订购日期的对象,则设置一个日期,否则我需要将其设置为空。

code:
    var order = new OrderSetup
                {
                    Customer = Customer,
                    Total = Total,
                    OrderDate = string.Compare(OrderStatus, "Today", StringComparison.OrdinalIgnoreCase) == 0 ?
                                     Dates.TodayOrderDate :
                                     string.Compare(OrderStatus, "Tomorrow", StringComparison.OrdinalIgnoreCase) == 0 ?
                                     Dates.TommorrowOrderDate : (DateTime?)null //is this the best way where it seems like I have to set this as a nullable datetime.
                };
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,535
地点
悉尼,澳大利亚
编程经验
10+
If you're using C# 8.0 or later then you can use a switch expression. If I'm not mistaken, that would look like this:
C#:
OrderDate = OrderStatus switch
{
        "Today" => Dates.TodayOrderDate,
        "Tomorrow" => Dates.TomorrowOrderDate,
        _ => (DateTime?) null
}
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,052
地点
挪威
编程经验
10+
How do you force a case insensitive match with a switch?
尽管看起来并不那么优雅,但这似乎可行:
C#:
var OrderDate = OrderStatus switch
{
    string _ when OrderStatus.Equals("Today", StringComparison.CurrentCultureIgnoreCase) => Dates.TodayOrderDate,
    string _ when OrderStatus.Equals("Tomorrow", StringComparison.CurrentCultureIgnoreCase) => Dates.TomorrowOrderDate,
    _ => (DateTime?)null
};
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,535
地点
悉尼,澳大利亚
编程经验
10+
How do you force a case insensitive match with a switch?
I kind of overlooked that part. Got all excited about using a switch expression, which I've never actually done before.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,535
地点
悉尼,澳大利亚
编程经验
10+
尽管看起来并不那么优雅,但这似乎可行:
C#:
var OrderDate = OrderStatus switch
{
    string _ when OrderStatus.Equals("Today", StringComparison.CurrentCultureIgnoreCase) => Dates.TodayOrderDate,
    string _ when OrderStatus.Equals("Tomorrow", StringComparison.CurrentCultureIgnoreCase) => Dates.TomorrowOrderDate,
    _ => (DateTime?)null
};
我建议它可能比嵌套三元运算符还要优雅。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,542
地点
弗吉尼亚州切萨皮克
编程经验
10+
The only way, I can think of to make things cleaner like in post #2 is to use switch Order status?.ToUpper(), and then put all the literal strings in caps, but that assumes that the input language is not Turkish and that the literal string to be compared does not contain an I.
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,535
地点
悉尼,澳大利亚
编程经验
10+
The only way, I can think of to make things cleaner like in post #2 is to use switch Order status?.ToUpper(), and then put all the literal strings in caps, but that assumes that the input language is not Turkish and that the literal string to be compared does not contain an I.
I can't help thinking that that OrderStatus should be an enum rather than a string 和 then case would be irrelevant. It depends what the possible values are but I would assume that only a specific set of values would be valid, in which case it absolutely should be an enum.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,542
地点
弗吉尼亚州切萨皮克
编程经验
10+
真的。如果唯一的选择是null,Today或Tomorrow,那么一个可为null的日期时间似乎是多余的。
 
最佳 底部