2016-05-23 8 views
1

Wie würde ich überprüfen, ob der Wert i ich sehe, ist gleich, oder im Bereich einer Zahl in einer Liste?Herauszufinden Wert ist ähnlich wie alle Werte in der Liste

So zum Beispiel habe ich eine Nummer i = 2, und eine Nummer i = 2.1 in einer Liste, und ich möchte nicht i = 2 der Liste hinzufügen, weil sie ziemlich ähnliche Zahlen sind. Ich habe Schwierigkeiten, einen sauberen Weg dafür zu finden. Irgendwelche Vorschläge?

+1

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

+0

Bitte definieren Sie, was "ähnlich" in diesem Fall sein soll. Nur dann ist es möglich, eine Lösung zu haben. –

+0

"Ä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

Antwort

2

Nun können Sie vor dem Hinzufügen nach ähnlichen Werten suchen. nicelly in LINQ ausgedrückt:

var list = new List<double> { 2.1, 4, 5, 5.1 }; 
var i = 2; 
var e = 0.5; 

var hasSimilar = list.Any(x => Math.Abs(x - i) <= e); 
if(!hasSimilar) 
    list.Add(i); 
+0

Vielen Dank an alle für Ihre schnellen Antworten! Diese Lösung funktioniert am besten für meinen Fall. – John

1

Eine gängige Methode zum Testen, ob ein Wert innerhalb eines bestimmten Bereichs liegt, ist Math.Abs. Zum Beispiel, wenn Sie für alle Zahlen innerhalb 0.5 von 2 suchen, können Sie sie finden wie folgt:

var target = 2; 
var tolerance = 0.5; 
var twoPlusMinusHalf = list.Where(x => Math.Abs(x-target) <= tolerance).ToList(); 
0

Wie Hill in ihrem Kommentar erwähnt, müssen Sie bestimmen, was „ähnliche Zahlen“ für Sie bedeutet und dann implementieren Sie diese Logik.

Für Ihr Beispiel würden Sie eine einfache if überprüfen, um zu sehen, ob die Zahlen im gewünschten Bereich sind.

if (i >= 2 && i < 2.2) 
    listName.Add(i); 
+0

Diese Methode prüft nur auf einen bestimmten Wert und funktioniert nicht mit einer großen Anzahl von Zahlen. – John

+0

@John Dies war nur ein Beispiel, das meinen Standpunkt anhand der von ihm angegebenen Zahlen illustrierte.Die Konstanten im obigen Code könnten für eine größere Flexibilität leicht in Variablen geändert werden. –

0
List<double> myList = new List<double>(); 
//Build list 

double epsilon = 0.5; 
double newValue = ...; 
bool addToList = true; 
foreach(double val : myList) 
    if(Math.Abs(val - newValue) < epsilon) 
    { 
     addToList = false; 
     break; //You don't need to check any further 
    } 

if(addToList) 
    myList.Add(newValue); 
0

Wenn Sie negative Zahlen erwarten Abs nicht verwenden, versuchen Boden oder Decke mit.

Double i = 4; 
    List<double> ListOfNumbers = new List<double>(); 
    Double Floored = Math.Floor(i); 

    if (!ListOfNumbers.Contains(Floored)) 
    {//If not found add the number for later 
     ListOfNumbers.Add(Floored); 
    } 
1

Try This ..........

 List<double> list = new List<double>(); 
     list.Add(1); 
     list.Add(2.1); 
     list.Add(3.5); 
     list.Add(4.9); 
     list.Add(5); 

     double i=2; 

     int cnt = 0; 
     foreach(var item in list) 
     { 
      if(i==item || i==(item-0.1)) 
      { 
       cnt = 1; 
      } 
     } 

     if(cnt<1) 
     { 
      list.Add(i); 
     } 
+1

Versuchen Sie, Ihre Antwort zu verbessern, indem Sie eine Erklärung hinzufügen, die Ihrem Code entspricht. – bwegs

0

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.

Verwandte Themen