C# 从文本文件读入锯齿数组
我在你们网站上的一个老问题中发现了这个问题,所以我想我可以做到,但我想我错了:-) 原来的职位是 我对锯齿数组是个新手,所以我编写了以下代码C# 从文本文件读入锯齿数组,c#,jagged-arrays,C#,Jagged Arrays,我在你们网站上的一个老问题中发现了这个问题,所以我想我可以做到,但我想我错了:-) 原来的职位是 我对锯齿数组是个新手,所以我编写了以下代码 StreamReader rows = new StreamReader("c:\\practice.txt"); string line; int i; i=1; while ((line = rows.ReadLine()) != null)
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;
}
}
StreamReader行=新的StreamReader(“c:\\practice.txt”);
弦线;
int i;
i=1;
而((line=rows.ReadLine())!=null)
{
字符串[][]行=新字符串[i][];
rows=rows.ReadLine();
字符串[][]行=新字符串[S.Length][];
i++;
}
for(int i;i
我知道我犯了很大的错误,但在east,我试过让任何人帮我把它变成一个工作代码。首先,确保在using语句中包装非托管资源,如流 就我个人而言,我喜欢我的类,它使阅读文件中的文本行(实际上是其他任何内容)变得容易 下一步,除非你真的需要,否则我会<代码>列表通常更易于使用。现在,如果string.Split符合您的要求,您可以轻松地创建一个
列表
。或者,您也可以使用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和我开发的原因)。但是,您可以使用普通的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;
}
}
如果按性别对行进行分组,可能会使这一点更加简单,特别是如果您知道性别始终为“男性”或“女性”。首先,请确保在using语句中包装非托管资源,如流 就我个人而言,我喜欢我的类,它使阅读文件中的文本行(实际上是其他任何内容)变得容易 下一步,除非你真的需要,否则我会<代码>列表通常更易于使用。现在,如果string.Split符合您的要求,您可以轻松地创建一个
列表
。或者,您也可以使用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和我开发的原因)。但是,您可以使用普通的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;
}
}
如果按性别对行进行分组,可能会使这一点更加简单,特别是如果您知道性别总是“男性”或“女性”。您似乎在重复这些行,或者可能您混淆了行和单元格-这一点看起来特别真的很奇怪:
while ((line = rows.ReadLine()) != null)
{
String[][]rows = new String [i][]; ;
rows = rows.ReadLine();
String[][] rows = new string[S.Length][];
i++;
}
i、 e.重新声明行,每个循环调用两次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);
}
}
使用系统;
使用System.IO;
静态类程序
{
静态void Main()
{
string[]lines=File.ReadAllLines(“foo.txt”);
字符串[][]网格=新字符串[行.长度][];
对于(int i=0;i
再一次-我再强调也不过分,你应该用LINQ而不是手动循环来做这件事…你似乎在重复读行,或者可能你把行和单元格弄混了-这一点看起来特别奇怪:
while ((line = rows.ReadLine()) != null)
{
String[][]rows = new String [i][]; ;
rows = rows.ReadLine();
String[][] rows = new string[S.Length][];
i++;
}
i、 e.重新声明行,每个循环调用两次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);
}
}
使用系统;
使用System.IO;
静态类程序
{
静态void Main()
{
string[]lines=File.ReadAllLines(“foo.txt”);
字符串[][]网格=新字符串[行.长度][];
对于(int i=0;i