-1

2 でインデックス付けされた行だけでなく、すべての行に対してこのループをループする必要があります。また、二重解析でエラーが発生します。

以下を行う効率的な方法はありますか?

ファイルには可変長の行を含めることができます。したがって、各行のサイズを格納する配列を維持する必要があります。

 public static void ReadFile()
    {
        int lineNo;
        List<List<double>> numbers = new List<List<double>>();
        foreach (string line in File.ReadAllLines("Data.txt"))
        {
            var list = new List<float>();
            foreach (string s in line.Split(new[]{',', ' '}, StringSplitOptions.RemoveEmptyEntries))
            {
                int i;
                if(double.TryParse(s, out i))
                {
                    list.Add(i);
                    lineNo++;
                }
            }
            numbers.Add(list);
        }

        var specialNumber = numbers[3][4];        // gives line 3 number 4
        var specialLine = numbers[2].ToArray();   //  gives an array of numbers of line 2

        double[] rowTotal;
        double[] squareRowTotal;
        double[] rowMean;

        //I need to loop this loop for all rows and not just the row indexed by 2. Also I am getting an error in the double parsing.

        for (int j=0; j<(specialLine.Length); j++)
        {
            rowTotal[2] = rowTotal[2] + numbers[2][j];
            squareRowTotal[2] = squareRowTotal[2] + numbers[2][j] * numbers[2][j];
        }

        for (int k = 0; k < lineNo; k++)
        {
            rowMean[k] = rowTotal[k] / numbers[k].Length;
        }
    }
4

3 に答える 3

1

ところで、データ アクセス ロジックとデータ処理ロジックを分割することをお勧めします。double 値の性質を説明する名前を持つ型を宣言することも検討してください。例えば

public class BowlingGame
{
   private List<double> _scores = new List<double>();

   public BowlingGame(IEnumerable<double> scores)
   {
       _scores.AddRange(scores);
   }

   public double Total
   {
       get { return _scores.Sum(); }
   }

   // implementation for SquareTotal and Mean
}

そして、解析メソッドからこのエンティティのリストを返します:

public static IEnumerable<BowlingGame> ParseFile()
{
   List<BowlingGame> games = new List<BowlingGame>();
   foreach (string line in File.ReadAllLines(@"c:\temp\test.csv"))
        games.Add(ParseGame(line));
   return games;
}

private static BowlingGame ParseGame(string line)
{
    var scores = new List<double>();
    foreach (string s in line.Split(new[] { ',', ' ' }))
    {
        double score;
        if (Double.TryParse(s, out score))            
             scores.Add(score);
    }

    return new BowlingGame(scores);
}

使用法:

foreach(var game in GameParser.ParseFile())
{
    Console.WriteLine(game.Total);
    Console.WriteLine(game.Mean);
}

あなたのコードに何が問題なのですか?あなたは宣言しました

List<List<double>> numbers = new List<List<double>>();

しかし、そこに整数のリストを追加しようとしています

 var list = new List<int>();

double.TryParse(s, out i)double out パラメータも必要ですが、整数を渡しています。

Linq を使用して、ループ内で値を計算できます (使用する前に配列を初期化することを忘れないでください)。

double[] rowTotal = new double[numbers.Count];

for (int rowIndex = 0; rowIndex < numbers.Count; rowIndex++)            
    rowTotal[rowIndex] = numbers[rowIndex].Sum();

}

于 2012-07-23T10:11:11.617 に答える
0

あなたの答えは次のようになるはずです(ループする代わりにLINQを使用しました!):

public void ReadFile()
{
    int lineNo = 0;
    List<List<double>> numbers = new List<List<double>>();
    foreach (string line in File.ReadAllLines("Data.txt"))
    {
        var list = new List<double>();
        foreach (string s in line.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries))
        {
            double i;
            if (double.TryParse(s, out i))
            {
                list.Add(i);
                lineNo++;
            }
        }
        numbers.Add(list);
    }

    var rowsTotal = new List<double>(numbers.Count);
    var squareRowTotal = new List<double>(numbers.Count);
    var rowMean = new List<double>(numbers.Count);

    rowsTotal.AddRange(numbers.Select(row => row.Sum()));
    squareRowTotal.AddRange(numbers.Select(row => row.Sum(d => d*d)));


    for (int k = 0; k < lineNo; k++)
    {
        rowMean[k] = rowsTotal[k] / numbers[k].Count;
    }
}
于 2012-07-23T10:24:45.837 に答える
0
    public static void ReadFile()
    {
        List<List<double>> numbers = new List<List<double>>();
        foreach (string line in File.ReadAllLines(@"c:\temp\test.csv"))
        {
            var list = new List<double>();
            foreach (string s in line.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries))
            {
                double i;
                if (Double.TryParse(s, out i))
                {
                    list.Add(i);
                }
            }
            numbers.Add(list);
        }

        double[] rowTotal = new double[numbers.Count];
        double[] squareRowTotal = new double[numbers.Count];
        double[] rowMean = new double[numbers.Count];

        for(int row = 0; row < numbers.Count; row++)
        {
            var values = numbers[row].ToArray();

            rowTotal[row] = values.Sum();
            squareRowTotal[row] = values.Select(v => v * v).Sum();
            rowMean[row] = rowTotal[row] / rowTotal.Count();
        }
    }
于 2012-07-23T10:19:11.120 に答える