Domanda

Ho trovato questa domanda in una vecchia questione nel tuo sito web così ho pensato che posso farlo, ma credo che mi sbagliavo: -)

il vecchio post è stato qui

Sono nuovo la cosa matrice irregolare così ha fatto il seguente codice

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;    
                }
            }

So che ho fatto grandi errori, ma a est ho provato uno può aiutarmi per renderlo un codice workin

È stato utile?

Soluzione

Ti sembra di essere a doppio lettura delle linee, o forse hai mescolato righe e le celle - questo bit in particolare Look davvero dispari:

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

vale a dire. ri-dichiarano le righe, due chiamate a ReadLine per loop, ecc ho il sospetto si intende string.Split? In entrambi i casi, sia per uso File.ReadAllLines, o guardare alcune delle opzioni presentate ieri. Se siete disperati per utilizzare gli array, il nucleo potrebbe essere simile a:

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);
    }
}

Ancora una volta - non posso sottolineare abbastanza quanto si dovrebbe fare questo con LINQ, invece di looping manuale ...

Altri suggerimenti

In primo luogo, assicurarsi che si avvolge risorse non gestite come torrenti utilizzando le istruzioni.

Personalmente mi piace il mio LineReader classe che lo rende facile da leggere righe di testo da un file (o qualsiasi altra cosa, in realtà).

Poi, mi piacerebbe evitare l'uso di matrici a meno che non si hanno veramente a. List<T> è generalmente molto più piacevole con cui lavorare. Ora, se string.split fa ciò che si vuole, si può facilmente avere un List<String[]>. In alternativa, si può probabilmente fare un sacco di lavoro utilizzando 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]) };

Prendendo molteplici aggregati da un singolo flusso di dati è difficile in "normale" LINQ (che è il motivo per cui Marc Gravell e ho sviluppato Spingere LINQ ). Tuttavia, è possibile utilizzare una normale istruzione 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;
    }
}

Se si raggruppato le righe di genere si potrebbe essere in grado di rendere questo ancora più semplice, soprattutto se si sa che il sesso è sempre "maschio" o "femmina".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top