문제

나는 당신의 웹 사이트의 오래된 질문 에서이 질문을 발견했기 때문에 내가 할 수 있다고 생각했지만 나는 착각했다고 생각합니다 :-)

오래된 게시물이었다 여기

나는 들쭉날쭉 한 배열에 새로 새로워졌습니다.

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

나는 내가 큰 실수를 저지른 것을 알고 있지만 동쪽에서 나는 시도한 사람이 내가 그것을 작업하는 코드로 만들도록 도와 줄 수 있습니까?

도움이 되었습니까?

해결책

당신은 선을 두 번 읽는 것처럼 보이거나 행과 셀을 혼합했을 수도 있습니다. 진짜 이상한:

        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로 얼마나 많은 일을 해야하는지 충분히 강조 할 수 없습니다 ...

다른 팁

먼저, 명령문을 사용하여 스트림과 같은 관리되지 않는 리소스를 래핑해야합니다.

개인적으로 나는 나의 것을 좋아한다 라이너 리더 클래스는 파일 (또는 다른 것)에서 텍스트 줄을 쉽게 읽을 수 있도록합니다.

다음으로, 나는 배열 사용을 피하십시오 당신이 정말로 필요하지 않는 한. List<T> 일반적으로 함께 일하기가 훨씬 더 즐겁습니다. 이제 string.split가 원하는 것을 수행하면 쉽게 List<String[]>. 또는 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과 내가 개발 한 이유입니다. 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;
    }
}

성별별로 행을 그룹화했다면, 특히 성별이 항상 "남성"또는 "여성"이라는 것을 알고 있다면 더 간단하게 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top