将变量赋值给lambda表达式的结果

Vis*_*ish 1 c# lambda

我想完成以下内容:

(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分配给变量然后调用它来实现这一点,但我认为定义并立即调用它是"更干净".

Eri*_*ert 7

首先,要真正回答你的问题:你可以通过将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)