如何在空白字符上拆分数字字符串并转换为整数

时间:2019-01-26 19:51:25

标签: c#

我正在做一些家庭作业,我需要从用户那里得到输入,这是一行用空格分隔的数字。我想拆分此字符串并取出单个数字,以便将其插入到二叉搜索树中。

我尝试了分割功能,并能够消除空白,但是我不确定如何“收集”单个数字。

        string data;
        string[] newdata = { };
        Console.WriteLine("Please enter a list of integers with spaces 
                           between each number.\n");
        data = Console.ReadLine();
        newdata = data.Split(null);

        Console.WriteLine(String.Join(Environment.NewLine, newdata));

我想以某种方式从newdata字符串数组中收集元素并将其转换为整数,但是我很难确定该怎么做。

5 个答案:

答案 0 :(得分:5)

好吧,您可以结合使用Linq .Select方法和.Split方法:

List<int> newData = data.Split(' ').Select(int.Parse).ToList();

如果希望用户能够输入空格,则需要在分割后修剪结果字符串。为此,我们可以使用string.Split方法的另一种StringSplitOptions重载:

List<int> newData = data.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToList();

最后,如果您想允许用户有时输入不正确的数据并仍然收集有效的整数,则可以使用int.TryParse并筛选出错误解析的值:

List<int> newData = data.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries)
                        .Select(s => int.TryParse(s.Trim(), out var n) ? (int?)n : null)
                        .Where(x => x != null)
                        .Select(i => i.Value)
                        .ToList();

答案 1 :(得分:3)

确定为代码:

var words = data.Split();
int i;
List<int> integers = new List<int>();
foreach(var s in words)
{
  if (int.TryParse(s, out i)) {integers.Add(i);}
}
// now you have a list of integers
// if using decimal, use decimal instead of integer

答案 2 :(得分:2)

已经提供了一些智能LINQ答案,这是我的扩展分步解决方案,该解决方案还允许忽略无效数字:

//Read input string
Console.Write("Input numbers separated by space: ");
string inputString = Console.ReadLine();
//Split by spaces
string[] splittedInput = inputString.Split(' ');
//Create a list to store all valid numbers
List<int> validNumbers = new List<int>();
//Iterate all splitted parts
foreach (string input in splittedInput)
{
    //Try to parse the splitted part
    if (int.TryParse(input, out int number) == true)
    {
        //Add the valid number
        validNumbers.Add(number);
    }
}
//Print all valid numbers
Console.WriteLine(string.Join(", ", validNumbers));

答案 3 :(得分:1)

您可以执行以下操作。

var numbers = Console.ReadLine();
var listOfNumbers = numbers.Split(new[]{" "},StringSplitOptions.RemoveEmptyEntries)
                           .Select(x=> Int32.Parse(x));

以上几行根据“空白”分割用户输入,删除了两者之间的任何空条目,然后将字符串数字转换为整数。

StringSplitOptions.RemoveEmptyEntries确保删除空条目。空条目的示例是一个字符串,其中两个分隔符彼此相邻。例如"2 3 4 5",在2和3之间有两个空格,这意味着当您使用空格作为分隔符分割字符串时,最终会在数组中得到一个空元素。通过使用StringSplitOptions.RemoveEmptyEntries

可以消除这种情况

根据您期望的是整数还是小数,可以使用Int32.ParseDouble.Parse(或浮点数/小数等)

此外,您可以进行检查以确保您拥有有效的号码,否则将引发异常。您可以按以下方式更改查询。

var listOfNumbers = numbers.Split(new[]{" "},StringSplitOptions.RemoveEmptyEntries)
                   .Select(x=> 
                    {
                        Console.WriteLine(x);
                        if(Int32.TryParse(x,out var number))
                            return number;
                        else
                            throw new Exception("Element is not a number");
                    });

这可确保列表中的所有元素都是有效数字,否则将引发异常。

答案 4 :(得分:0)

保留空格并使用空格“ data.split('');”进行“拆分”。