Ich denke, die beste Möglichkeit, die Leistung in Bedingungen (oder In jeder Hinsicht) ist zu unterscheiden mit der IEqualityComparer Schnittstelle.
Obwohl jedesmal ein neuer Vergleich für jede Klasse implementiert wird, ist dies umständlich und führt zu Codebausteinen.
Also hier ist eine Erweiterung Methode, die eine neue IEqualityComparer im laufenden Betrieb für jede Klasse mit Reflexion erzeugt.
Verbrauch:
var filtered = taskList.DistinctBy(t => t.TaskExternalId).ToArray();
Erweiterungsmethode-Code
public static class LinqExtensions
{
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> items, Func<T, TKey> property)
{
GeneralPropertyComparer<T, TKey> comparer = new GeneralPropertyComparer<T,TKey>(property);
return items.Distinct(comparer);
}
}
public class GeneralPropertyComparer<T,TKey> : IEqualityComparer<T>
{
private Func<T, TKey> expr { get; set; }
public GeneralPropertyComparer (Func<T, TKey> expr)
{
this.expr = expr;
}
public bool Equals(T left, T right)
{
var leftProp = expr.Invoke(left);
var rightProp = expr.Invoke(right);
if (leftProp == null && rightProp == null)
return true;
else if (leftProp == null^rightProp == null)
return false;
else
return leftProp.Equals(rightProp);
}
public int GetHashCode(T obj)
{
var prop = expr.Invoke(obj);
return (prop==null)? 0:prop.GetHashCode();
}
}
@NateGates: Ich habe gerade mit der Person gesprochen, die vor zwei Tagen den Kurs abgelehnt hat. – Guffa
Ich denke, dass kein Overhead existiert! –
@AmirHosseinMehrvarzi: Es gibt ein wenig Overhead, da die Gruppen erstellt werden, und dann nur ein Element aus jeder Gruppe verwendet wird. – Guffa