【问题标题】:reading from a text file into a jagged array从文本文件读取到锯齿状数组
【发布时间】:2008-12-12 08:41:09
【问题描述】:

我在您网站的一个旧问题中发现了这个问题,所以我认为我可以做到,但我想我错了:-)

旧帖是here

我是锯齿状数组的新手,下面的代码也是如此

StreamReader rows = new StreamReader("c:\\practice.txt");
            string line;
            int i;
            i=1;
            while ((line = rows.ReadLine()) != null)
            {
                String[][]rows = new String [i][]; ;
                rows = rows.ReadLine();
                String[][] rows = new string[S.Length][];
                i++;
            }
            for (int i; i < S.Length; i++)
            {

                row[i] = S[I].Split(',');

            }

            int totalCounter = 0, totalSum = 0;
            // etc
            foreach(string[] row in rows)
            {    
                int m1 = int.Parse(row[3]);
                totalCounter++;
                totalSum += m1;
                switch(row[2])
                {        
                    case "male":
                    maleCount++;            
                    maleSum += m1;            
                        break;        
                    case "female":            
                        femaleCount++;            
                        femaleSum += m1;            
                        break;    
                }
            }

我知道我犯了重大错误,但在东部我尝试了任何人都可以帮助我使其成为工作代码

【问题讨论】:

  • 几乎不旧 - 它是昨天的,今天仍在更新......
  • 我不相信“不做作业”......和suzana在同一个班什么的?

标签: c# jagged-arrays


【解决方案1】:

您似乎在重复阅读这些行,或者您可能混淆了行和单元格 - 这一点尤其看起来真的很奇怪:

        while ((line = rows.ReadLine()) != null)
        {
            String[][]rows = new String [i][]; ;
            rows = rows.ReadLine();
            String[][] rows = new string[S.Length][];
            i++;
        }

即重新声明行,每个循环两次调用ReadLine,等等。我怀疑你的意思是string.Split?无论哪种方式,要么使用File.ReadAllLines,要么查看昨天提供的一些选项。如果您迫切需要使用数组,核心可能类似于:

using System;
using System.IO;
static class Program
{
    static void Main()
    {
        string[] lines = File.ReadAllLines("foo.txt");
        string[][] grid = new string[lines.Length][];
        for (int i = 0; i < lines.Length; i++)
        {
            grid[i] = lines[i].Split(',');
        }

        int totalCount = 0, maleCount = 0, femaleCount = 0,
            m1Total = 0, m2Total = 0, m3Total = 0,
            m1MaleTotal = 0, m1FemaleTotal = 0;
        foreach (string[] line in grid)
        {
            totalCount++;
            int m1 = int.Parse(line[3]),
                m2 = int.Parse(line[4]),
                m3 = int.Parse(line[5]);
            m1Total += m1;
            m2Total += m2;
            m3Total += m3;
            switch (line[1].Trim())
            {
                case "male":
                    maleCount++;
                    m1MaleTotal += m1;
                    break;
                case "female":
                    femaleCount++;
                    m1FemaleTotal += m1;
                    break;
            }
        }
        Console.WriteLine("Rows: " + totalCount);
        Console.WriteLine("Total m1: " + m1Total);
        Console.WriteLine("Average m1: " + ((double)m1Total)/totalCount);
        Console.WriteLine("Male Average m1: " + ((double)m1MaleTotal) / maleCount);
        Console.WriteLine("Female Average m1: " + ((double)m1FemaleTotal) / femaleCount);
    }
}

再一次 - 我不能强调你应该用 LINQ 做多少而不是手动循环......

【讨论】:

  • 昨天的选项太先进了,我做不到,但你能告诉我如何解决这个问题
  • 但是如果我想计算 m2 和 m3 怎么办
  • thanx Marc 你是最棒的
【解决方案2】:

首先,确保将流等非托管资源包装在 using 语句中。

就我个人而言,我喜欢我的 LineReader 类,它可以轻松地从文件(或其他任何内容)中读取文本行。

接下来,我会avoid using arrays,除非你真的必须这样做。 List&lt;T&gt; 通常使用起来更愉快。现在,如果 string.Split 可以满足您的需求,您可以轻松拥有List&lt;String[]&gt;。或者,您可以使用 LINQ 完成很多工作:

var query = from line in new LineReader("c:\\practice.txt")
            let parts = line.Split(',')
            select new { Gender=parts[2], Amount=int.Parse(parts[3]) };

在“普通”LINQ 中从单个数据流中获取多个聚合是很棘手的(这就是我和 Marc Gravell 开发Push LINQ 的原因)。但是,您可以使用普通的 foreach 语句:

int totalCounter = 0, totalSum = 0;
int maleCount = 0, maleSum = 0, femaleCount = 0, femaleSum = 0;
foreach (var row in query)
{
    totalCounter++;
    totalSum += row.Amount;
    switch (row.Gender)
    {
        case "male":
            maleCount++;
            maleSum += Amount;
            break;
        case "female":
            femaleCount++;
            femaleSum += Amount;
            break;
    }
}

如果您按性别对行进行分组,您可能会更简单,特别是如果您知道性别始终是“男性”或“女性”。

【讨论】:

  • 很好,但仍然可以通过数组来实现
  • 我昨天得到了 PushLINQ 示例;-p
  • brandon:如果你想要一个数组,只需调用 ToArray()
猜你喜欢
  • 2015-10-18
  • 2014-12-22
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2021-05-17
  • 2015-12-09
  • 2017-09-27
  • 1970-01-01
相关资源
最近更新 更多