Pergunta

Eu encontrei esta pergunta em uma velha pergunta em seu site para que eu pensei que eu posso fazer isso, mas eu acho que eu estava enganado: -)

The Old Post foi aqui

Eu sou novo para a coisa matriz denteada assim fez o seguinte código

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

Eu sei que fiz grandes erros, mas ao i leste tentou qualquer um pode me ajudar a torná-lo um código workin

Foi útil?

Solução

Você parece ser duas vezes lendo as linhas, ou talvez você tenha misturado linhas e células - este bit em particular aparência realmente estranho:

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

i. re-declarar linhas, duas chamadas para ReadLine por laço, etc. eu suspeito que você string.Split média? De qualquer forma, tanto para uso File.ReadAllLines, ou olhada em algumas das opções apresentadas ontem. Se você está desesperado para usar matrizes, o núcleo pode ser algo como:

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

Mais uma vez - eu não posso enfatizar o suficiente o quanto você deve estar fazendo isso com o LINQ em vez de looping manual de ...

Outras dicas

Em primeiro lugar, certifique-se de envolver recursos não gerenciados, como correntes no uso de declarações.

Pessoalmente, eu como a minha classe LineReader o que o torna fácil de ler linhas de texto de um arquivo (ou qualquer outra coisa, na verdade).

Em seguida, eu tinha evitar o uso de matrizes menos que você realmente precisa. List<T> é geralmente muito mais agradável para trabalhar. Agora, se string.split faz o que quiser, você pode facilmente ter uma List<String[]>. Alternativamente, você provavelmente pode fazer um monte de trabalho usando 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]) };

Tomar vários agregados a partir de um único fluxo de dados é complicado em LINQ "normal" (que é por Marc Gravell e eu desenvolvemos premir LINQ ). No entanto, você pode usar uma instrução foreach normal:

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 você agrupadas as linhas por sexo que você pode ser capaz de fazer isso ainda mais simples, especialmente se você sabe que o sexo é sempre "masculino" ou "feminino".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top