开发者

Conditionally assign C# var: As elegant as it gets?

开发者 https://www.devze.com 2022-12-15 09:20 出处:网络
I understand that the C# keyword var implies the type at compile time and therefore requires the declaration and assignment in the same place, making the following construct illegal:

I understand that the C# keyword var implies the type at compile time and therefore requires the declaration and assignment in the same place, making the following construct illegal:

var something;

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

Even though the C# compiler could principally determine that all assignments in 开发者_Python百科the current scope result in the same type, it (presently) does not and therefore generates a compile time error.

In using var with LINQ, I sometimes want to initialize my result variable slightly differently depending on program conditions. The approach I have found is to use the ?: operator, as in:

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

That works well enough if I just have two possible assignments, but quickly becomes unwieldy if there are multiple possible assignments.

Is there a more elegant approach to this?


You could use .Where(...) rather than query syntax:

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

but personally I simply wouldn't use var here - it doesn't scale beyond 2, but this is a classic "search" pattern. I might use:

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

This allows multiple conditions to be composed (in this case "AND") for a more specific query. You can also do "OR" but it is slightly more complex (unless you use Concat/Union, which is messy).


This strikes me as a workaround for a database design problem.

I think the more elegant approach would be factoring the code in such a way as to have one method that handles each different program condition.

I.e.:

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

精彩评论

暂无评论...
验证码 换一张
取 消