在匿名类型中包含基于条件的属性

Nul*_*nce 6 .net c# anonymous-types

假设我有以下匿名类型

var g = records.Select(r => new
{                    
    Id = r.CardholderNo,
    TimeIn = r.ArriveTime,
    TimeOut = r.LeaveTime,
});
Run Code Online (Sandbox Code Playgroud)

是否可以执行如下操作:

var g = records.Select(r => new
{                    
    Id = r.CardholderNo,
    if (condition) 
    {
        TimeIn = r.ArriveTime;
    },
    TimeOut = r.LeaveTime,
    //many more properties that I'd like to be dependant on conditions.
});
Run Code Online (Sandbox Code Playgroud)

如何根据条件实现匿名类型?

Wou*_*ort 6

您可以使用三元运算符来做到这一点: ?:

语法是这样的:

TimeIn = condition ? r.ArriveTime : (DateTime?)null // Or DateTime.Min or whatever value you want to use as default
Run Code Online (Sandbox Code Playgroud)

更新

在考虑了你的问题几分钟后,我想出了以下你永远不应该使用的代码;)

using System;

class Program
{
    static void Main(string[] args)
    {
        DateTime dt = DateTime.Now;

        bool condition = true;

        dynamic result = condition ?
            (object)new
            {
                id = 1,
                prop = dt
            }
            :
            (object)new
            {
                id = 2,
            };

        Console.WriteLine(result.id);
        if (condition) Console.WriteLine(result.prop);
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码永远不应该在生产中使用,因为它的可读性很差,而且很容易出错。然而,作为学习该语言的可能性的示例,它非常好。


Yuv*_*kov 5

不直接使用if语句,但您可以使用三元运算符来执行此操作(假设TimeIn类型为DateTime):

var g = records.Select(r => new
{

    Id = r.CardholderNo,
    TimeIn = condition ? r.ArriveTime : (DateTime?)null;
    TimeOut = r.LeaveTime
});
Run Code Online (Sandbox Code Playgroud)

请注意,这将使该属性始终出现在您的匿名类型中。如果这不是所需的行为,那么您就不能这样做。

我建议考虑代码的可读性,而不仅仅是“如何缩短这几行,使其看起来整洁”。