Wenn Sie all die Nullen einschließen möchten Sie die Null-Eigenschaft mit etwas ersetzen müssen, die einzigartig ist, wenn es null ist. Unter der Annahme, dass die Eigenschaft eine Zeichenfolge ist, wird Guid für diesen Job gut funktionieren.
.DistinctBy(m => m.SomeUniqueMovieProperty ?? Guid.NewGuid().ToString())
Jedes Mal, wenn es eine Eigenschaft mit einem Nullwert trifft, wird es mit einem zufälligen neuen GUID-Wert gefüllt.
Wenn Sie auch leer Titel nicht haben, um die Abfrage erhalten entfernt Änderung
.DistinctBy(m => String.IsNullOrEmpty(m.SomeUniqueMovieProperty) ? Guid.NewGuid().ToString() : m.SomeUniqueMovieProperty)
Eine weitere Option ist Ihre eigene DistinctBy
machen, die die Art und Weise Sie wollen verhält. Dies ist eine optimierte Version der original source, die nur den Filter anwendet, wenn shouldApplyFilter
Wahr zurückgibt, Kommentare werden auch der Kürze halber entfernt.
static partial class MoreEnumerable
{
public static IEnumerable<TSource> ConditionalDistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, Func<TKey, bool> shouldApplyFilter)
{
return source.ConditionalDistinctBy(keySelector, shouldApplyFilter, null);
}
public static IEnumerable<TSource> ConditionalDistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, Func<TKey, bool> shouldApplyFilter, IEqualityComparer<TKey> comparer)
{
if (source == null) throw new ArgumentNullException("source");
if (keySelector == null) throw new ArgumentNullException("keySelector");
if (shouldApplyFilter == null) throw new ArgumentNullException("shouldApplyFilter");
return ConditionalDistinctByImpl(source, keySelector, shouldApplyFilter, comparer);
}
private static IEnumerable<TSource> ConditionalDistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, Func<TKey, bool> shouldApplyFilter, IEqualityComparer<TKey> comparer)
{
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
var key = keySelector(element);
if (shouldApplyFilter(key) && knownKeys.Add(key))
{
yield return element;
}
}
}
}
Es wäre wie
.ConditionalDistinctBy(m => m.SomeUniqueMovieProperty, s => !String.IsNullOrEmpty(s));
würde ich Ihrer Wahl folgen. Filtern Sie die Einsen aus, um den Wert der Eigenschaft null zu erhalten. Führen Sie distinct nach dem Wert aus, und führen Sie ihn dann mit den gefilterten Werten zusammen. – rageit