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

时间:2015-02-10 11:24:31

标签: c# arrays linq collections ienumerable

我有一个包含大量数字的文件,每个索引有4个子编号

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

该文件是一个cvs文件,但是我需要将数字作为double类型读入数组并进行插值,所以我需要遍历该表。

到现在为止,我有这个,但是我被困住了,并且我不知道如何将文件转换为double值,所以我可以开始计算它们。有什么建议吗?

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

3 个答案:

答案 0 :(得分:1)

您可以拆分该行,将每个部分解析为十进制,并使用SelectMany来展平结果:

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

答案 1 :(得分:1)

如果你想要一个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();

答案 2 :(得分:0)

如果每行中都有某些值,比如说你的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);
}