有条件地分配C#var:它是否优雅?

Eri*_* J. 4 c# type-inference

我理解C#关键字var在编译时隐含类型,因此需要在同一位置声明和赋值,使以下构造非法:

var something;

if (condition)
{
    something=1;
}
else
{
    something = 0;
}
Run Code Online (Sandbox Code Playgroud)

尽管C#编译器可以主要确定当前作用域中的所有赋值都是相同的类型,但它(当前)却没有,因此会生成编译时错误.

在将LIN与LINQ一起使用时,我有时希望根据程序条件略微不同地初始化我的结果变量.我发现的方法是使用?:运算符,如:

var participants = (email == null ?
                   (from part in db.Participant
                    where part.SequenceNumber == seqNr
                    select part)
                   :
                   (from part in db.Participant
                    where part.EmailAddress == email
                    select part));
Run Code Online (Sandbox Code Playgroud)

如果我只有两个可能的任务,那就足够了,但如果有多个可能的任务,很快就会变得笨拙.

有更优雅的方法吗?

Mar*_*ell 8

您可以使用.Where(...)而不是查询语法:

var participants = email == null
    ? db.Participant.Where(p => p.SequenceNumber == seqNr)
    : db.Participant.Where(p => p.EmailAddress == email);
Run Code Online (Sandbox Code Playgroud)

但就我个人而言,我根本就不会var在这里使用它 - 它不会超过2,但这是一个经典的"搜索"模式.我可能会用:

IQueryable<Part> query = db.Participant;
if(email != null) query = query.Where(p => p.EmailAddress == email);
if(seqNr != null) query = query.Where(p => p.SequenceNumber == seqNr);
...
// consume query
Run Code Online (Sandbox Code Playgroud)

这允许组合多个条件(在这种情况下为"AND")以用于更具体的查询.你也可以做"或",但它稍微复杂一点(除非你使用Concat/ Union,这是凌乱的).