2014-04-02 45 views
0

我正在构建基于控制台的彩票游戏,用户输入他/她的数字选择。我需要检查数字是在1-39之间,用户输入了7个有效数字。我想以用户在控制台中将它们写入一行字符串的方式执行此操作,并且程序找到任何空格,逗号或其他非数字字符并忽略它们。其余的彩票号码应存储在整数数组中,不包含任何重复项。我想从字符串搜索整数并将它们存储在数组中

我目前的版本非常糟糕,因为如果用户编写例如数字之间有2个空格。

Console.WriteLine("Choose 7 numbers (1-39) by pressing ENTER after every number:"); 
     string userRow = Console.ReadLine(); 
     int[] userLottery = new int[7]; 
     for(int i = 0; i < userLottery.Length; i++) 
      { 
       userLottery = userRow.Split(',', '.', ' ').Select(x => int.Parse(x)).ToArray(); 
       if(userLottery[i] > 7) 
       { 
        Array.Resize(ref userLottery, 7); 
       } 
      } 

我想以更方便的方式替换目前的方式,其中用户错误的数量不会影响程序。如果用户写入多个空格,则会发生错误。

我试图建立正则表达式来处理这些情况,但我不能用它来将它们存储到数组中。

string userChoice = Console.ReadLine(); 
     MatchCollection userNumbers = Regex.Matches(userChoice, @"\d+"); 
     int[] userRow; 

     for(int i = 0; i < userNumbers.Count; i++) 
     { 
      userRow[i] = userNumbers[i].Value; 
     } 

,说字符串不能转换成int [] ...

+0

所以它的工作原理,但脆:做什么,你告诉用户下面?什么是问题? –

+0

你的具体问题是什么? – Coops

+0

我想以更方便的方式替换我目前的用户错误数量不会影响程序的方式。如果用户写入多个空格,则会发生错误。并 – johnnyCasual

回答

0

您的代码与用户的指令不符。

Console.WriteLine("Choose 7 numbers (1-39) by pressing ENTER after every number:"); 
    int[] userLottery = new int[7]; 

    int i = 0; 
    while (i < 7) 
    { 
     Console.Write("Your choice #{0}: ", i+1); 
     string userRow = Console.ReadLine(); 
     int userNumber; 

     if (!Int32.TryParse(userRow, out userNumber) || userNumber < 1 || userNumber > 39) 
     { 
      Console.WriteLine("Invalid number! Please try again!"); 
     } 
     else 
     { 
      userLottery[i++] = userNumber; 
     } 
    } 
+0

我真的很喜欢这个!我加了一个 - 如果要测试数组是否已经存在于数组中,所以没有任何重复 – johnnyCasual

0

使用Regex.Split()这个处理多个空格。

string[] numbers = Regex.Split(userRow, @"\s+"); 

\s+表示一个或多个空格。如果需要,您只能使用[ ]+

1

你可以使用使用String.Split这个LINQ查询与RemoveEmptyEntriesint.tryParse

int num = 0; 
int[] userLottery = userRow.Trim() 
    .Split(new[] { '.', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries) 
    .Where(s => int.TryParse(s.Trim(), out num) && num > 0 && num < 40) 
    .Select(s => num) 
    .Distinct() 
    .ToArray(); 
if(userLottery.Length != 7) 
    Console.WriteLine("Enter 7 valid numbers between 1 and 39"); 
else 
    Console.WriteLine("You have chosen following numbers: " + string.Join(",", userLottery)); 

Enumerable.Distinct删除重复的要求。

+0

谢谢!得到它的工作:)! – johnnyCasual

0

你可以先用RegEx解析它,然后它就可以工作。

using System.Text.RegularExpressions; 

    Console.WriteLine("Choose 7 numbers (1-39) by pressing ENTER after every number:"); 
    string userRow = Console.ReadLine(); 
    int[] userLottery = new int[7]; 

    string[] userEnter = Regex.Split(userRow, " "); 

    int n = 0; 
    int k = 0; 
    for (int i = 0; i < userEnter.Length; i++) 
    { 
    bool isNumeric = int.TryParse(userEnter[i], out n); 
    if(isNumeric == true) 
    { 
     userLottery[k] = int.Parse(userEnter[i]); 
     k++; 
    } 
    } 
0

使用下面的代码

 Console.WriteLine("Choose 7 numbers (1-39) by pressing ENTER after every number:"); 

     string data = Console.ReadLine(); 

     int[] userLottery = new int[7]; 
     int i = 0; 

     StringBuilder num = new StringBuilder(); 
     foreach (char item in data) 
     { 


      if (!Char.IsDigit(item)) 
      { 
       if (num.Length == 0) 
        continue; 
       userLottery[i] = int.Parse(num.ToString()); 
       i++; 
       num.Clear(); 
       continue; 
      } 

      num.Append(item); 
     } 

     if(num.Length > 0) 
      userLottery[i] = int.Parse(num.ToString()); 
相关问题