C# Lambda returns some null values

2019-04-22 20:54发布

问题:

opencall.Priority = 
averages.Where(x => x.ProblemCode == opencall.ProblemCode)
.SingleOrDefault().Priority;

The above lambda statement returns some nulls because ProblemCode isn't always guaranteed to be in the averages list.

How can I rewrite this statement so that if that is the case opencall.Priority is set to "" instead of the application throwing an error?

回答1:

You have to provide a new default value for your reference type, other than null.

opencall.Priority = averages.Where(x => x.ProblemCode == opencall.ProblemCode)
                            .Select(x => x.Priority)
                            .DefaultIfEmpty("")
                            .Single(); 

So Priority is a string? Note that you don't need SingleOrDefault anymore since the query can never throw an exception because it is empty when you provide a DefaultIfEmpty.



回答2:

Split it up:

 var result = averages.Where(x => x.ProblemCode == opencall.ProblemCode).SingleOrDefault()
 opencall.Priority = result != null ? result.Priority : string.Empty;


回答3:

Try getting the problem code first, then check if it's null.

var possiblyNullProblemCode= 
    averages.Where(
        x => x.ProblemCode == opencall.ProblemCode)
        .SingleOrDefault();

openCall.Priority = 
    possiblyNullProblemCode == null ? 
        string.Empty : 
        possiblyNullProblemCode.Priority;


回答4:

Assuming Priority is string, you could try:

var average = averages.Where(x => x.ProblemCode == opencall.ProblemCode).SingleOrDefault()
opencall.Priority = average == null ? "" : average.Priority;


回答5:

You can simply write:

opencall.Priority = 
    averages.Where(x => x.ProblemCode == opencall.ProblemCode)
    .Select(x => x.Priority)
    .SingleOrDefault() ?? string.Empty;