34707


C#のString型の二次元のリストから，double型の二次元配列への変換に苦戦しています。  
なお，ここで変換されるものは，行，列の数が等しい正方行列です。  
お手伝いいただければ幸いです。

よろしくお願いします。


CC BY-SA 3.0
2017-05-14T14:10:26.847
34705
2017-05-19T07:19:40.003
2017-05-14T14:18:57.160
23148
23148
question
c# array
c# 二次元のリストから二次元配列への変換について


`List<List<string>>`を`double[,]`に変換したいということでしょうか。  
でしたら基本的には以下のような処理になります。

[code]

    // List<List<string>> list;
    var rowCount = list.Count;
    var colCount = rowCount;
    
    var r = new double[rowCount, colCount];
    
    for (int y = 0; y < rowCount; y++)
    {
        var src = list[y];
        for (int x = 0; x < colCount; x++)
        {
            r[y, x] = double.Parse(src[x]);
        }
    }
    
[/code]

加えて考慮すべきポイントを列挙すると以下のようなものがあります。

  * 二次元配列の添字の順番。配列をネイティブAPIに渡す場合は要注意。行を先にした場合( **行優先** )、メモリ上には`r[0 ,0]`, `r[0, 1]`, …, `r[0, colCount - 1]`, `r[1, 0]`, …の順で値が並ぶ。
  * `list[y]`が`null`である場合のエラー処理。
  * `list[y]`の要素数が想定より少ない場合のエラー処理。
  * `list[y][x]`が数値でない場合のエラー処理。無視する場合は`double.TryParse`を使用する。
  * 正方行列でない場合の`colCount`の求め方。`list[0].Count`もしくは`list.Max(e => e.Count)`。


CC BY-SA 3.0
2017-05-14T15:14:42.007
34707
2017-05-14T15:14:42.007
5750
34705
answer


C#ということでLINQを使ってみた場合を提示。

[code]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace parseTrial
    {
        class Program
        {
            static void Main(string[] args)
            {
                //宣言とデータの定義
                var nestedList = new List<List<string>>();
    
                nestedList.Add(new List<string>() { "0.11", "0.12", "0.13" });
                nestedList.Add(new List<string>() { "0.21", "0.22", "0.23" });
                nestedList.Add(new List<string>() { "0.31", "0.32", "0.33" });
    
                //タイプがstringである証明
                foreach (var inlineList in nestedList)
                {
                    foreach (var item in inlineList)
                    {
                        Console.WriteLine(item.GetType()+"\t"+item);
                    }
                }
    
                //LINQを用いて型変換
                var parsedList = nestedList
                    .Select(val => val
                        .Select(val2 => double.Parse(val2)).ToArray()
                    ).ToArray();
    
                Console.WriteLine();
    
                //タイプがdoubleである証明
                foreach (var inlineList in parsedList)
                {
                    foreach (var item in inlineList)
                    {
                        Console.WriteLine(item.GetType() + "\t" + item);
                    }
                }
            }
        }
    }
    
[/code]

そのまま実行すれば型が変わっていることも確認が取れます。  
実際の処理としてはLINQを用いて～の部分のみです。


CC BY-SA 3.0
2017-05-19T07:19:40.003
34832
2017-05-19T07:19:40.003
23239
34705
answer