Wenn Sie einen benutzerdefinierten comparer wie folgt erstellen:
class CloseEnough : IEqualityComparer<double>
{
public bool Equals(double a, double b)
{
return Math.Abs(a - b) <= 0.5;
}
public int GetHashCode(double a)
{
return 2 * (Convert.ToInt32(a)/2);
}
}
dann können Sie verwenden, wenn eine Erstellung Satz:
var comparer = new CloseEnough();
var set = new HashSet<double>(comparer);
Sobald Sie das Set haben, Sie gerade Elemente hinzufügen, um es, und alle, die zu nahe an bestehende Elemente werden automatisch abgelehnt:
set.Add(1);
set.Add(1.1);
set.Add(1.6);
set.Add(2.1);
set.Add(2.11);
set.Add(10);
Die obigen Ergebnisse in set == { 1, 1.6, 2.11, 10 }
.
Beachten Sie, dass CloseEnough.GetHashCode()
interessant ist. Zwei Elemente, die gleich sind, müssen den gleichen Hash-Code haben. Wenn Sie dies im Produktionscode verwenden, möchten Sie testen, dass dies immer der Fall ist.
Sie müssen entscheiden, was "schließen" in Ihrer Situation bedeutet. Danach sollte es einfach sein, durch die Liste zu gehen, um zu sehen, ob die Zahlen "nahe" sind. – Hill
Bitte definieren Sie, was "ähnlich" in diesem Fall sein soll. Nur dann ist es möglich, eine Lösung zu haben. –
"Ähnliche" und "Schließen" sind willkürlich. Sagen Sie für diesen Fall "0,5". Wie überprüfe ich, ob ein Wert in einer Liste innerhalb dieses Bereichs liegt, sodass ich bestimmen kann, ob dieser Wert zur Liste hinzugefügt oder verworfen werden soll? – John