2012-04-12 9 views
3

Es gibt eine ReiheSortierung Nächste Zahlen von Array mit

int[] array = new int[]{6,4,10,7,7,9}; 

und eine Nummer 8.

ich um 8 durch nächste Nummer sortiert das Array will.

die nächsten Zahlen: 9,7,7,10,6,4 jeweils

weil 9-1 = 8, 7 + 1 = 8, 7 + 1 = 8, 10-2 = 8, 6 +2 = 8, 4 + 4 = 8

Wie kann ich diese Nummern sortieren? eine Idee?

+2

Ist das Hausaufgaben? –

+0

Möglich. Seit ich erinnere mich an eine ähnliche Frage –

+1

mögliche Duplikate von [C# Finden der nächsten Nummer in Array] (http://stackoverflow.com/questions/10120944/c-sharp-finding-nearest-number-in-array) –

Antwort

4
var result = array.OrderBy(i => Math.Abs(i - value)) 
      .ThenBy(i => i < value) 
      .ToArray(); 
+2

Möchte das OP nicht, dass Zahlen größer als der Zielwert vor Nummern kleiner als die Zielnummer gesetzt werden, wenn die Differenz gleich ist? – devdigital

+0

yeah, d. H., Dies erzeugt '7,7,9,6,10,4 ', aber das OP möchte' 9,7,7,10,6,4' – Robbie

+0

@devdigital: Korrigiert, bevor Sie kommentiert haben. Wie auch immer, warum der Downvote, wenn OP nicht erwähnt hat, dass es wichtig ist? Es könnte einfach ein schlechtes Beispiel sein. –

2
int nearbyNumber = 8; 
var query = array.OrderBy(number => Math.Abs(number - nearbyNumber)); 

Sie können ToArray anrufen, wenn Sie wirklich ein Array benötigen.

Wenn Sie wirklich das Array an seinem Platz sortieren möchten Sie eine benutzerdefinierte Comparer Objekt machen können und Array.Sort verwenden, aber das ist mehr Arbeit ...

+1

Nicht so viel mehr Arbeit: 'Array.Sort (Array, (a, b) => {intc = Math.Abs ​​(n - a) .CompareTo (Math.Abs ​​(n - b)); zurück c! = 0? C: b.CompareTo (a);}); ' – digEmAll

+0

@digEmAll' Array.Sort' nimmt keine 'Func ' es dauert ein 'IComparer'. Dieses Lambda implementiert diese Schnittstelle nicht. – Servy

+0

Tatsächlich gibt es eine Überladung von Sort unter einem Delegaten -> [LINK] (http://msdn.microsoft.com/en-us/library/cxt053xf%28v=vs.80%29.aspx). Außerdem habe ich diese Codezeile getestet;) – digEmAll

1
var array = new int[] { 6, 4, 10, 7, 7, 9 }; 
int target = 8; 
var values = array.OrderBy(i => Math.Abs(i - target)).ToArray(); 

EDIT hatte ich diese Antwort super schnell, dann SO stoppte mich mit einem Captcha, der fragte, ob es ein Mensch sei. Vielen Dank SO! :)

+0

Ja, das Captcha ist ein Schmerz, aber dies produziert 7,7,9,6,10,4 und das OP will 9,7,7,10,6,4 – Robbie

+0

sein Beispiel Ausgabe ist in dieser Reihenfolge, aber er doesn Sag nicht, dass er in dieser Reihenfolge sein muss. – payo

+0

vorausgesetzt, dies ist das zweite Mal, dass er diese Frage gestellt und der einzige Unterschied zwischen den beiden Fragen ist, dass er die Zahlen in dieser bestimmten Reihenfolge hinzugefügt, dann muss er sie in dieser Reihenfolge wollen. Aber ich bin nicht pingelig, ich habe nur gesagt ... – Robbie