问题
Trying to sort a list of data that contains the following:
The txt. file currently looks like this but will be extended to include more, about 100 or so. 900 is just used as an upper limit.
21,f, s, 14
41,f, m, 22
12, m, s, 12
11, f, s, 8
29, m, m, 4
6, m, s, 12
9, f, s, 2
30, f, s, 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
class Program
{
const int SIZE = 900;
const int SIZEDISTRICT = 22;
const int RANGE = 5;
static void Main()
{
//These arrays will hold the split data from a text file.
int[] districtDataD = new int[900];
string[] districtDataG = new string[900];
string[] districtDataM = new string[900];
int[] districtDataA = new int[900];
//countDistrict will hold how many hypothetical people in each hypothetical district and
//ages will hold how many hypothetical people between certain hypothetical ages.
int[] countDistrict = new int[SIZEDISTRICT];
int[] ages = new int[RANGE] { 0, 18, 30, 45, 65};
//Modules
ReadFile(districtDataD, districtDataG, districtDataM,districtDataA);
CountPopulation(districtDataD, countDistrict);
AgeRanges(districtDataA, ages);
DisplayData(countDistrict, districtDataA, ages);
}//End Main
//This module splits and inserts the data into the four first arrays
static void ReadFile(int[] districtDataD, string[] districtDataG, string[] districtDataM, int[] districtDataA)
{
string[] lines = File.ReadAllLines("census.txt");
int i = 0;
while (i < SIZE && i < 0)
{
foreach (string line in File.ReadAllLines("census.txt"))
{
string[] parts = line.Split(',');
districtDataD[i] = int.Parse(parts[0]);
districtDataG[i] = parts[1];
districtDataM[i] = parts[2];
districtDataA[i] = int.Parse(parts[3]);
i++;
}
}
}
//This module counts how many hypothetical people are in each fictional district
static void CountPopulation(int[] districtDataD, int[] countDistrict)
{
int i = 0;
for (i = 0; i < districtDataD.Length; i++)
{
if (districtDataD[i] > 0 && districtDataD[i] < districtDataD.Length)
{
districtDataD[countDistrict[i]]
++;
}
}
}
//This module sorts the ages into 0-18, 19-30, 31-45, 46-65, and 65 and up
private static void AgeRanges(int[] districtDataA, int[] ages)
{
int idx = 0;
for (idx = 0; idx < districtDataA.Length && ages[idx] > districtDataA[idx]; idx++)
{
ages[idx] = districtDataA[idx];
}
}
//This module displays the data
static void DisplayData(int[] countDistrict, int[] districtDataA, int[] ages)
{
int index = 0;
for (index = 0; index < countDistrict.Length; index++)
{
Console.WriteLine(" District {0}: {1}", index + 1, countDistrict[index]);
}
int x = 0;
for (x = 0; x < ages.Length; x++)
{
Console.WriteLine("Ages over {0} : {1}", ages[x], districtDataA[x]);
}
}
}
The current output looks like this:

Where is my data getting lost?
回答1:
The problem is in this line.
while (i < SIZE && i < 0)
This loop never executes. Replace it with this.
while (i < SIZE && i <= 0)
{
foreach (string line in File.ReadAllLines("census.txt"))
{
if (!string.IsNullOrEmpty(line))
{
string[] parts = line.Split(',');
districtDataD[i] = int.Parse(parts[0]);
districtDataG[i] = parts[1];
districtDataM[i] = parts[2];
districtDataA[i] = int.Parse(parts[3]);
i++;
}
}
}
回答2:
Your ReadFile
is wrong. Try something like this instead.
static void ReadFile(int[] districtDataD, string[] districtDataG, string[] districtDataM, int[] districtDataA)
{
// Read in the file contents
string[] lines = File.ReadAllLines("census.txt");
int i =0;
//iterate through each line
foreach(var line in lines)
{
//split the line by a comma
string[] parts = line.Split(',');
districtDataD[i] = int.Parse(parts[0]);
districtDataG[i] = parts[1];
districtDataM[i] = parts[2];
districtDataA[i] = int.Parse(parts[3]);
i++;
}
}
You are currently reading in the file and assigning it to lines
then reading the file in again and assigning the value to line
. If you use foreach
you can easily loop through each line without having to keep track of which line you are on.
来源:https://stackoverflow.com/questions/15876082/my-input-gets-lost-somewhere-along-the-wayprinting-0s