将字符串数组转换为双数组

Converting string array to double array

我有一个包含很多数字的文件,每个索引有 4 个子数字

no1 no2 no3 no4 
no1 no2 no3 no4 
no1 no2 no3 no4 

该文件是一个 cvs 文件,但我需要将数字读入 double 类型的数组并进行插值,因此我需要遍历 table.

直到现在我都有这个,但我被卡住了,我真的不知道如何很好地将文件转换为双精度值,所以我可以开始计算它们。有什么建议吗?

var filelines = from line in file.Skip(5)
                select line.Split(';');

您可以拆分线,将每个部分解析为小数并使用 SelectMany 来展平结果:

file.Skip(5).SelectMany(line => line.Split(';').Select(decimal.Parse)).ToArray()

如果你想要一个double[][],那么每行一个数组:

double d;
double[][] lineValues = file.Skip(5)
    .Select(l => l.Split(new[]{';'}, StringSplitOptions.RemoveEmptyEntries))
    .Where(arr => arr.Length == 4 && arr.All(s => double.TryParse(s, out d)))
    .Select(arr => arr.Select(double.Parse).ToArray())
    .ToArray();

如果每一行都有特定的值,比如说你的 cvs 数据存储有特定数量的字段,更明智的强类型移动是首先为你的数据存储构建一个模型,根据您提供的信息将是:

public class MyCVSModel {
    public Double Number1 {get; set;} 
    public Double Number2 {get; set;} 
    public Double Number3 {get; set;} 
    public Double Number4 {get; set;} 
}

现在,您可以:

public static IEnumerable<MyCVSModel> Converion(String FileName){
     var AllLines = System.IO.ReadAllLines(FileName);
     foreach(var i in AllLines){
        var Temp = i.Split('\t'); // Or any other delimiter
        if (Temp.Lenght >= 4){ // 4 is because you have 4 values in a row
           List<Double> TryConversion = new List<Double>();
           foreach(var x in Temp) {
              if (IsDouble(x))
                 TryConversion.Add(Convert.ToDouble(x));
              else
                 TryConversion.Add(0);
           }
           MyCVSModel Model = new MyCVSModel();
           Model.Number1 = TryConversion[0];
           Model.Number2 = TryConversion[1];
           Model.Number3 = TryConversion[2];
           Model.Number4 = TryConversion[3];
           yield return Model;
        }
     }
}

public static Boolean IsDouble(String Value) {
    Regex R = new Regex(@"^[0-9]*(?:\.[0-9]*)?$");
    return R.IsMatch(Value);
}