将String []转换为int [],然后将int []转换为单独的变量(x,y,z)

时间:2016-01-10 06:57:42

标签: c# arrays string methods integer

我是编程新手并决定采取步骤学习C#,在完成某些教程,书籍和其他指南时,我遇到了StreamReader命令。

由于我的学习方式是使用我发现有趣的新命令,我决定只是通过命令挖掘我的方法,看看我能做些什么。

这导致了这个问题,我的代码在这里完成了我想要的工作。

它接受文件中的行,将其转换为字符串数组,然后将其转换为int数组,然后将数组的每个部分分类到一个变量中,以便在代码的主要部分中使用。

我想知道的是有更清洁的方法吗? 当我从文件中提取第二个,口渴等...时,我是否可以使用我的特纳方法(?)重复此过程?

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StreamReaderToIntArray
{
   class Program
    {
        static void Main(string[] args)
        {
            int x = 0;
            int y = 0;
            int z = 0;

            string[] stringSeperators = new string[] { " " };

            StreamReader myReader = new StreamReader("Values.txt");
            string line = myReader.ReadLine();
            var myArray = line.Split(stringSeperators, StringSplitOptions.RemoveEmptyEntries);
            myReader.Close();

            Turner(myArray, out x, out y, out z);
        }

        static private int Turner(string[] newArray, out int x, out int y, out int z)
        {
           int[] cArray = newArray.Select(int.Parse).ToArray();

           x = cArray[0];
           y = cArray[1];
           z = cArray[2];


            return x;
        }
    }
}

3 个答案:

答案 0 :(得分:0)

我看到的唯一问题是int.Parse()如果它不喜欢输入则抛出异常。此外,您永远不会检查该行是否实际包含3个值。我不想将out用于三个值,当它们可以合并为一个struct Point { int x,y,z; }并从函数中返回时。

所以我建议使用int.TryParse()为解析创建一个Extension Method,并返回一个与字符串数组大小相同的整数数组。

{
    string line = myReader.ReadLine();
    var point = Point.Parse(line);
}

public struct Point
{
    readonly int x, y, z;  // Always make struct immutable
    public Point(int x,int y,int z)
    {
       this.x = x;
       this.y = y;
       this.z = z;
    }

    public int X { get { return x; } }
    public int Y { get { return y; } }
    public int Z { get { return z; } }

    public static Point Parse(string line)
    {
      var parts = line.Split(stringSeperators, StringSplitOptions.RemoveEmptyEntries);
      var array = parts.Select( (s)=> s.ParseInt() ).ToArray();
      if(array.Length>=3) 
      {
          return new Point(array[0],array[1],array[2]);
      }      
      throw new IndexOutOfRangeException();
    }
}

// Example extensions for parsing strings
public static class Extensions
{
    public int ParseInt(this string value)
    {
        int x = 0;
        int.TryParse(value, out x);
        return x;
    }
    public float ParseFloat(this string value)
    {
        float x = 0;
        float.TryParse(value, out x);
        return x;
    }
}

答案 1 :(得分:0)

如果您确信文本文件包含一行,其中三个数字由一个或多个空格分隔,则此代码有效:

int[] values =
    File
        .ReadAllText("Values.txt")
        .Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
        .Select(int.Parse)
        .ToArray();

int x = values[0];
int y = values[1];
int z = values[2];

答案 2 :(得分:0)

在您的情况下,而不是使用StreamReader尝试File.ReadAllLines From MSDN

static void Main(string[] args)
{
    int x = 0;
    int y = 0;
    int z = 0;

    string[] stringSeperators = new string[] { " " };

    string[] lines = File.ReadAllLines("Values.txt");
    foreach(string line in lines)
    {
       string[] myArray = line.Split(stringSeperators,
                                     StringSplitOptions.RemoveEmptyEntries);
       Turner(myArray, out x, out y, out z); 
    }       
}

但是使用这种方法,变量x, y, z将只保留最后一行的值 考虑使用@ ja72' struct来保存值并创建值ListArray