2017-05-29 14 views
1

Ich muss eine Liste von Zahlen mit einem vom Benutzer eingegebenen Bereich überprüfen, zum Beispiel gibt der Benutzer einen Bereich von 105323 bis 106324 ein. Die Liste stellt Zahlen dar, die der Benutzer kennt fehlen. Wenn also der Benutzer den Bereich eingibt und die Liste 106100 und 106101 enthält, muss ich alle Zahlen im Bereich ausgeben, die 106100 und 106101 überspringen oder entfernen. Ich bin sicher, das ist einfach, aber ich habe nur Probleme mit der Logik. Hier ist, was ich bisher habeC# Überprüfung einer Liste von Zahlen gegen einen vom Benutzer eingegebenen Bereich

 var startSeq = uxSeqStart.Text; 
     var startNum = Convert.ToInt32(startSeq); 
     var endSeq = uxSeqEnd.Text; 
     var endNum = Convert.ToInt32(endSeq); 

     for (var a = startNum; a <= endNum; a++) 
     { 

      foreach (int num in _MissingInt.ToList()) 
      { 
       if (num + 1 == a) { _MissingInt.Remove(num); } 
      } 

      Console.WriteLine(a);//test output not a console app 
     } 

    } 

Ich hoffe, was ich frage, macht Sinn. Bitte lassen Sie mich wissen, wenn ich auf dem richtigen Weg bin, wird jede Eingabe sehr geschätzt

+0

warum fügen Sie eins zu num hinzu? Ich dachte, Sie wollten die Nummern in dem vom Benutzer angegebenen Bereich entfernen? –

+0

@Rufus L, auf meiner Ausgabe wurde nicht meine letzte fehlende Nummer im Bereich erfasst.Ich weiß, das Plus 1 ist nicht richtig, aber für den Zweck, die Funktionalität als Ganzes zu testen, habe ich es getan –

Antwort

2

Wenn ich Sie richtig verstehe, haben Sie eine Liste von ganzen Zahlen, die nicht in einem Bereich enthalten sein sollte, und Sie erhalten eine Reihe von ganzen Zahlen von der Benutzer. Dann möchten Sie die "fehlenden Ints" aus dem Bereich entfernen.

Eine einfache Möglichkeit, einen Bereich von fortlaufenden Nummern zu generieren, ist die Verwendung der 10-Methode, Enumerable.Range(), in der Sie eine Startnummer und eine Anzahl von zu generierenden Zahlen übergeben. Wir können die Startnummer verwenden, die der Benutzer eingegeben, sondern weil sie eine Endnummer und nicht eine Zählung eingeben, müssen wir ein wenig Mathematik tun, um die Zählung zu bestimmen:

// Generate a range of numbers based on the user input 
var range = Enumerable.Range(startNum, endNum - startNum + 1); 

Dann können Sie eine weitere System.Linq Erweiterung verwenden Methode namens Except() auf dem Bereich, um die Elemente in _MissingInt Liste zu entfernen, wenn sie vorhanden sind. Except Mittel "umfassen alle Elemente aus der ursprünglichen Liste, außer einer, der in einer anderen Liste existieren":

// Remove any numbers in the _MissingInt from range if they exist 
range = range.Except(_MissingInt); 

setzen sie alle zusammen, würde es wie folgt aussehen:

static void Main() 
{ 
    var _MissingInt = new List<int> { 106100, 106101 }; 

    var startNum = 105323; 
    var endNum = 106101; 

    var range = Enumerable.Range(startNum, endNum - startNum + 1).Except(_MissingInt); 

    // Output the range with missing ints removed 
    Console.WriteLine("Modified Range:"); 
    Console.WriteLine(string.Join(", ", range)); 

    Console.Write("\nDone!\nPress any key to exit..."); 
    Console.ReadKey(); 
} 

Ausgabe

(Beachten Sie, dass die letzten beiden Nummern, die in unserer _MissingInt Liste enthalten waren, entfernt werden):

enter image description here

+0

Ich glaube, was er sucht ist, wenn das, wenn der Benutzer 1 bis 9 und seine Liste 2 eingeben, 4 und 7, würde es 1, 3, 5, 6, 8 und 9 – snaplemouton

+0

Ah, ich sehe. Der Prozess ist im Grunde der gleiche, aber ich habe die Antwort für die Frage aktualisiert. –

+0

@snaplemount, das ist richtig, genau das möchte ich machen. @ Rufus L, deine Lösung hat perfekt funktioniert. Danke euch allen. –

2

Sie können versuchen, Linq zu verwenden, um die Sammlung zu generieren (z. Array):

HashSet<int> missing = new HashSet<int>() { 
    106100, 106101, 
    }; 

    int start = 105323; // included 
    int stop = 106324; // included 

    var result = Enumerable 
    .Range(start, stop - start + 1) 
    .Where(item => !missing.Contains(item)) 
    .ToArray(); 

-Test

Console.Write(string.Join(" ", result));  
0

Es gibt viele Möglichkeiten, dies zu tun.

Dmitry Bychenko Lösung ist kurz und einfach.

Da Sie nur Ganzzahlen verwenden, können Sie jedoch einfach Ihre Liste der fehlenden Zahlen ordnen und dann den Vorgang mit einem Faktor N (gehen Sie durch Ihre Sequenz einmal) statt N * Enthält (für jede Zahl in der Sequenz , Anruf enthält).

var startSeq = uxSeqStart.Text; 
var startNum = Convert.ToInt32(startSeq); 
var endSeq = uxSeqEnd.Text; 
var endNum = Convert.ToInt32(endSeq); 
Int[] missingInts = _MissingInt.ToList(); 

missingInts.sort(); 

foreach(int num in missingInts) 
{ 
    while(startNum <= endNum) 
    { 
     if (startNum == num) 
     { 
      startNum++; 
      break; 
     } 
     Console.WriteLine(startNum); 
     startNum++; 
    } 
} 
Verwandte Themen