我想完成以下内容:
(clientSinceChoices = Enumerable.Range(1949, DateTime.Now.Year - 1950)
.Select(x => new SelectListItem()
{
Text = x != 1949 ? x.ToString() : "Unselected",
Value = x != 1949 ? new DateTime(x, 1, 1).ToString() : null,
Selected = () =>
{
if (x == 1949 && !ClientSinceYearOnly.HasValue)
return true;
else if (ClientSinceYearOnly.Value == x)
return true;
else
return false;
}
}));
Run Code Online (Sandbox Code Playgroud)
我希望值Selected是内联定义的labmda表达式的结果.我知道我可以通过将lambda分配给变量然后调用它来实现这一点,但我认为定义并立即调用它是"更干净".
首先,要真正回答你的问题:你可以通过将lambda转发给委托来"调用"lambda:
bool x = ((Func<bool>) ()=>true) ();
Run Code Online (Sandbox Code Playgroud)
但是在你的代码中,首先不需要lambda; 我不明白为什么你有一个lambda.您想计算布尔值,因此计算布尔值:
Selected = (x == 1949 && !ClientSinceYearOnly.HasValue) ||
(ClientSinceYearOnly.Value == x)
Run Code Online (Sandbox Code Playgroud)
(另请注意,在比较之前,您不必检查可空值是否具有值;在C#中,等于"被提升为可空".)
其次,这个查询很乱,因为你有一个特殊情况.我不会在第一时间写这样的查询.我宁愿说:
var choices = new List<Item>();
choices.Add(new SelectListItem()
{
Text = "Unselected",
Value = null;
Selected = ClientSinceYearsOnly == null
};
choices.AddRange(
Enumerable.Range(1950, DateTime.Now.Year - 1951)
.Select(x => new SelectListItem()
{
Text = x.ToString(),
Value = new DateTime(x, 1, 1).ToString(),
Selected = x == ClientSinceYearOnly
});
Run Code Online (Sandbox Code Playgroud)
更清楚.或者,给自己写一个扩展方法,将某些内容粘贴到序列的开头:
public static IEnumerable<T> Prepend<T>(this IEnumerable<T> sequence, T first)
{
yield return first;
foreach(T item in sequence)
yield return item;
}
Run Code Online (Sandbox Code Playgroud)
然后:
var choices =
Enumerable.Range(1950, DateTime.Now.Year - 1951)
.Select(x => new SelectListItem()
{
Text = x.ToString(),
Value = new DateTime(x, 1, 1).ToString(),
Selected = x == ClientSinceYearOnly
})
.Prepend(new SelectListItem()
{
Text = "Unselected",
Value = null;
Selected = ClientSinceYearsOnly == null
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3175 次 |
| 最近记录: |