假设我有以下匿名类型
var g = records.Select(r => new
{
Id = r.CardholderNo,
TimeIn = r.ArriveTime,
TimeOut = r.LeaveTime,
});
是否可以执行以下操作:
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.
});
如何根据条件实现匿名类型?
答案 0 :(得分:4)
不直接使用if
语句,但您可以使用三元运算符(假设TimeIn
类型为DateTime
)来执行此操作:
var g = records.Select(r => new
{
Id = r.CardholderNo,
TimeIn = condition ? r.ArriveTime : (DateTime?)null;
TimeOut = r.LeaveTime
});
请注意,这会使属性始终显示在“匿名类型”中。如果这不是所需的行为,那么你就不能这样做。
我建议考虑代码的可读性,而不仅仅是关于"如何缩短这几行,使它看起来整洁"。
答案 1 :(得分:3)
您可以使用ternary operator: ?:
执行此操作语法如下:
TimeIn = condition ? r.ArriveTime : (DateTime?)null // Or DateTime.Min or whatever value you want to use as default
在考虑了几分钟的问题后,我想出了以下代码,你永远不应该使用它;)
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);
}
}
此代码永远不应该用于生产中,因为它的可读性很差,并且它确实容易出错。然而,作为一个学习的例子,说明这种语言的可能性是非常好的。
答案 2 :(得分:3)
没有。匿名类型与任何其他类型一样。它有一个固定的属性列表。您无法动态添加或删除属性。
我建议将属性设置为null
,与其他答案一样,或者使用Dictionary
添加相关属性及其值。
答案 3 :(得分:1)
如果你真的需要在匿名类型创建中使用if
(或任何其他语句),你可以试试这个不那么漂亮的解决方案:
var g = records.Select(r => new
{
Id = r.CardholderNo,
TimeIn = new Func<DateTime?, DateTime?>(x =>
{
if (...)
return x;
else
return null;
}).Invoke(r.ArriveTime),
TimeOut = r.LeaveTime,
});