2017-01-14 11 views
0

私がdouble[,]にそれを変換する必要があり文字列をdouble [、]に変換するには?

var str = "22.58277011|88.38303798,22.59950095|88.39352995"; 

下のように私は、最終的なアウトプットは、これまで

{ 
    {22.57891304, 88.34285622}, 
    {22.54398196, 88.38221001} 
}; 

私のアプローチでなければなりません...

を文字列を持っています

var str = "22.58277011|88.38303798,22.59950095|88.39352995,"; 
var strRep = str.Split(','); 

それ以降はどうしますか?事前LINQを使用して

+0

'double []'または 'double [、]'、1Dまたは2D配列が必要です。既にstring []に変換されているので、1次元配列に必要なのは、各文字列値に対してConvert.ToDoubleのようなものですが、2D配列を取得する方法はありません。 –

+0

2次元配列...出力は、{ {22.57891304、88.34285622}、 {22.54398196、88.38221001} }となります。 –

+0

"、"で分割した後に作成される配列は、文字列 "|"の各項目を持ちます。最初の配列をループし、 "|"を置き換える必要があります。各要素に "、"を付けてください。その後、コンマで区切られた文字列を持つすべての項目を含む最初の配列が作成されます。あなたは必要なフォーマットに変換できます。 –

答えて

4

おかげで、それはかなり簡単です:

double[][] arrays = string.Split(',') 
          .Select(s => s.Split('|') 
             .Select(d => double.Parse(d)) 
             .ToArray()) 
          .ToArray(); 

2次元配列にこれを変換するLINQのようにきれいではありません、私はかかわらず、(同様に非常に単純です恐れ)。

入力は常に有効になります、あなたが得る-離れでき String.Splitと仮定すると、
double[,] arr2d = new int[arrays.Length, arrays[0].Length]; 

for (int i = 0; i < arr2d.GetLength(0); i++) 
    for (int j = 0; j < arr2d.GetLength(1); j++) 
     if (i < arrays.Length && j < arrays[i].Length) 
      arr2d[i, j] = arrays[i][j]; 
+0

OPは、ジグザグ配列ではなく、2D配列を求めました。 – Dai

+0

@Dai 2つの間で変換するのはかなり簡単で素早い方法です。コードスニペットが見つかるかどうか確認してみましょう。 – Abion47

+0

@Dai「最後の出力は次のようになります」というスニペットでは、OPにネストされた配列が含まれているため、そこに混合信号があります。 –

4

private static readonly Char[] separators = new Char[] { ',', '|' }; 

... 

String input = "22.58277011|88.38303798,22.59950095|88.39352995,"; 
String[] numbers = input.Split(separators, StringSplitOptions.RemoveEmptyEntries); 
if((numbers.Length % 2) != 0) throw new ArgumentException("Input did not have an even number of elements."); 

Double[,] array = new Double[ numbers.Length/2, 2 ]; 

for(Int32 i = 0; i < inputs.Length; i += 2) { 

    String firstStr = inputs[i ]; 
    String secondStr = inputs[i + 1]; 

    // always parse these decimal values using InvariantCulture to prevent errors on computers set to French or German (for example) where the comma is the radix place 
    Decimal first = Decimal.Parse(firstStr, CultureInfo.InvariantCulture); 
    Decimal second = Decimal.Parse(secondStr, CultureInfo.InvariantCulture); 

    array[ i/2, 0 ] = first; 
    array[ i/2, 1 ] = second; 
} 

return array; 
2
string str = "22.58277011|88.38303798,22.59950095|88.39352995"; 
var list = str.Split(',').ToList(); 

var arr = new double[list.Count,2]; 

for (int i = 0; i < list.Count; i++) 
{ 
    var vals = list[i].Split('|'); 
    arr[i, 0] = Double.Parse(vals[0]); 
    arr[i, 1] = Double.Parse(vals[1]); 
} 
1

実行時に2D配列の作成とコードの作業、コードは確かにいくつかの例外を必要とします管理に基づいて、データに基づいて

// Input 
var str = "22.58277011|88.38303798,22.59950095|88.39352995"; 

var xAxisList = str.Split(',').ToList(); // Split on Comma 
var yAxisList = xAxisList.Select(yy => yy.Split('|').ToList()).ToList(); // Split on | 
var xAxisLength = xAxisList.Count; // X Axis count 
var yAxisLength = yAxisList.First().Count; // Y Axis Count 

var doubleResult = new double[xAxisLength,yAxisLength]; // Create a 2D array 

int xCounter = 0; 
int yCounter = 0; 

foreach (var dataList in yAxisList) 
{ 
    foreach (var data in dataList) 
    { 
     // Assuming all data can be correctly parsed to double, else it needs an additional check 
     doubleResult[xCounter,yCounter] = double.Parse(data); 
     yCounter++; 
    } 
    xCounter++; 
    yCounter = 0; 
} 

doubleResultを印刷することができます2次元配列の値を確認する

関連する問題