x.OnGoingChallenges?.Count
entspricht x.OnGoingChallenges != null ? x.OnGoingChallenges.Count : default(int?)
(es sind andere Ansätze, aber am Ende des Tages ist eine Verknüpfung auf null Prüfung null-bedingten Operator genannt) .
Das heißt, können Sie Ihren Code nicht mit einem syntaktisch elegante Erklärung ohne C# 6, neu geschrieben werden, aber Sie können diese neuen Methoden C# 6-Funktion Erweiterung emulieren ...
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);
}
}
Und jetzt Ihre Code in C# 5 würde wie folgt aussehen:
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);
Die gesamte Erweiterungsmethode für die Zeugung eines Wert typisierte Eigenschaftswert oder den Standardwert funktionieren würde. Sie können die Erweiterungsmethodenklasse erweitern oder auch nicht, um auch das Abrufen eines Referenztypwerts oder null zu unterstützen.
Nein, es ist nicht. – gdoron
Was ist dann deine Lösung? – senzacionale
@senzacionale, zum Beispiel ternärer Operator wie: '(x.MembershipIds == null? (Int?) Null: x.MembershipIds.Count)' – Grundy