2017-05-29 52 views
1

我需要根據用戶輸入的範圍檢查一個數字列表,例如,用戶將輸入範圍105323至106324.該列表表示用戶知道的數字缺失。所以如果用戶輸入的範圍和列表中包含106100和106101,我需要輸出範圍內的所有數字跳過或刪除106100和106101.我敢肯定這很簡單,但我只是遇到了麻煩邏輯。這是我到目前爲止C#根據用戶輸入的範圍檢查一個數字列表

 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 
     } 

    } 

我希望我所問的是有道理的。請讓我知道,如果我在正確的道路上,任何輸入將不勝感激

+0

爲什麼你要添加一個數字?我以爲你想刪除用戶指定範圍內的數字? –

+0

@Rufus L,在我的輸出中,它沒有捕獲我在範圍內最後一個缺失的數字。我知道加1是不正確的,但爲了測試整個功能的目的,我做了 –

回答

2

如果我正確理解你,你有一個不應包含在一個範圍內的整數列表,用戶。然後你想從範圍中刪除「缺失的整數」。

生成一系列連續數字的簡單方法是使用System.Linq方法Enumerable.Range(),其中您傳入一個起始數字和一個要生成的數字的計數。我們可以使用用戶輸入的開始數,而是因爲他們正在進入一個端號碼的不計數,我們需要做一些數學來確定計數:

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

然後你可以使用另一個System.Linq擴展在範圍上調用Except()的方法可以刪除_MissingInt列表中的項目(如果存在)。 Except手段「包括從最初的名單,除了任何存在於另一個列表中的所有項目」:

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

全部放在一起,它看起來像:

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(); 
} 

輸出

(請注意,最後兩個數字在我們的_MissingInt列表中被刪除):

enter image description here

+0

我相信他在找什麼,如果如果用戶輸入1到9而他的列表包含2, 4和7,它會返回1,3,5,6,8和9, – snaplemouton

+0

啊,我明白了。這個過程基本上是一樣的,但我更新了問題的答案。 –

+0

@snaplemount,這是正確的,這正是我想要做的。 @ Rufus L,你的解決方案完美運作。謝謝你們。 –

2

您可以嘗試使用Linq以便生成集合(例如,陣列):

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(); 

測試

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

有很多方法可以做到這一點。

Dmitry Bychenko解決方案既簡單又容易。

但是,由於您只使用整數,因此您可以簡單地排列缺失數字的列表,然後使用因子N(通過一次序列)完成操作,而不是N * Contains(對於序列中的每個數字,請致電Contains)。

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++; 
    } 
} 
相關問題