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

时间:2009-12-31 23:33:33

标签: c# type-inference

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

var something;

if (condition)
{
    something=1;
}
else
{
    something = 0;
}

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

在LINQ中使用 var 时,我有时希望根据程序条件略微不同地初始化我的结果变量。我找到的方法是使用?:运算符,如:

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));

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

对此有更优雅的方法吗?

2 个答案:

答案 0 :(得分:8)

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

var participants = email == null
    ? db.Participant.Where(p => p.SequenceNumber == seqNr)
    : db.Participant.Where(p => p.EmailAddress == email);

但我个人不会在这里使用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

这允许组合多个条件(在这种情况下为“AND”)以用于更具体的查询。你也可以做“或”,但它稍微复杂一些(除非你使用Concat / Union,这很麻烦)。

答案 1 :(得分:0)

这对我来说是一个数据库设计问题的解决方法。

我认为更优雅的方法是将代码分解为使用一种处理每种不同程序条件的方法。

I.e。:

if (email == null) {
    DoStuffWhenEmailIsNull();
}
else {
    DoStuffWhenEmailIsNotNull();
}