문제
나는 당신의 웹 사이트의 오래된 질문 에서이 질문을 발견했기 때문에 내가 할 수 있다고 생각했지만 나는 착각했다고 생각합니다 :-)
오래된 게시물이었다 여기
나는 들쭉날쭉 한 배열에 새로 새로워졌습니다.
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;
}
}
성별별로 행을 그룹화했다면, 특히 성별이 항상 "남성"또는 "여성"이라는 것을 알고 있다면 더 간단하게 만들 수 있습니다.