x.OnGoingChallenges?.Count
equivale a x.OnGoingChallenges != null ? x.OnGoingChallenges.Count : default(int?)
(ci sei altri approcci, ma alla fine della giornata è una scorciatoia a null checking chiamato null-condizionale dell'operatore) .
Cioè, il codice non può essere riscritta con un sintatticamente dichiarazione elegante senza C# 6, ma è possibile emulare questa nuova funzione C# 6 utilizzando metodi di estensione ...
public static class StructExtensions
{
// Check that TProperty is nullable for the return value (this is how C#6's
// null-conditional operator works with value types
public static TProperty? GetOrDefault<TObject, TProperty>(this TObject someObject, Func<TObject, TProperty> propertySelectionFunc)
where TObject : class
where TProperty : struct
{
Contract.Requires(propertySelectionFunc != null);
return someObject == null ? default(TProperty?) : propertySelectionFunc(someObject);
}
}
Ed ora la tua codice in C# 5 apparirebbe come segue:
var isEqual = x.Id == y.Id
&& x.UpdatedAt == y.UpdatedAt
&& x.Name == y.Name
&& x.RulesUrl == y.RulesUrl
&& x.OngoingChallenges.GetOrDefault(c => c.Count) == y.OngoingChallenges.GetOrDefault(c => c.Count)
&& x.MembershipIds.GetOrDefault(m => m.Count) == x.MembershipIds.GetOrDefault(m => m.Count);
Il metodo di estensione insieme potrebbero lavorare per ottenere un valore di proprietà valore digitato o il suo valore di default. È possibile o meno estendere la classe del metodo di estensione per supportare anche il richiamo di un valore del tipo di riferimento o null.
fonte
2015-12-27 19:47:11
No, non c'è. – gdoron
qual è la tua soluzione allora? – senzacionale
@senzacionale, ad esempio operatore ternario come: '(x.MembershipIds == null? (Int?) Null: x.MembershipIds.Count)' – Grundy