我有一个C#控制台窗口程序,我试图在3个文本文件的升序和输出行中对“File3”(包含数字)进行排序。 所以结果看起来像这样:
===========================================================================
field1.....................field2.....................field3
===========================================================================
[FILE1_LINE1]..............[FILE2_LINE1]..............[FILE3_LINE1]
[FILE1_LINE2]..............[FILE2_LINE2]..............[FILE3_LINE2]
[FILE1_LINE3]..............[FILE2_LINE3]..............[FILE3_LINE3]
依旧......
目前,我认为它有点工作,但它重复前两行似乎。有人可以举一个更好的编码的例子吗? 这是我有的代码:
string[] File1 = System.IO.File.ReadAllLines(@"FILE1.txt");
string[] File2 = System.IO.File.ReadAllLines(@"FILE2.txt");
string[] File3 = System.IO.File.ReadAllLines(@"FILE3.txt");
decimal[] File3_1 = new decimal[File3.Length];
for(int i=0; i<File3.Length; i++)
{
File3_1[i] = decimal.Parse(File3[i]);
}
decimal[] File3_2 = new decimal[File3.Length];
for(int i=0; i<File3.Length; i++)
{
File3_2[i] = decimal.Parse(File3[i]);
}
decimal number = 0;
for (double i = 0.00; i < File3_1.Length; i++)
{
for (int sort = 0; sort < File3_1.Length - 1; sort++)
{
if (File3_1[sort] > File3_1[sort + 1])
{
number = File3_1[sort + 1];
File3_1[sort + 1] = File3_1[sort];
File3_1[sort] = number;
}
}
}
if (SortChoice2 == 1)
{
for (int y = 0; y < File3_2.Length; y++)
{
for (int s = 0; s < File3_2.Length; s++)
{
if (File3_1[y] == File3_2[s])
{
Console.WriteLine(File1[s] + File2[s] + File3_1[y]);
}
}
}
}
仅仅是为了获取更多信息,大部分代码都被用于另一个程序并且工作但是在我的新程序中,这并不像我上面所说的那样 - (“由于某种原因,它重复了几行”)。我有点像C#的业余/新手所以我只能用这样的东西来处理例子。
提前致谢:)
答案 0 :(得分:1)
好的,如果我理解正确的话,你要做的是从3个不同的文件中读取行,每个文件代表一个不同的&#34;字段&#34;在一张桌子里。然后,您希望根据其中一个字段的值对此表进行排序(在您的代码中,这似乎是File3
中包含值的字段。好吧,如果我做对了,这里&#39;我建议你做什么:
// Read data from files
List<string> inputFileNames = new List<string> {"File1.txt", "File2.txt", "File3.txt"};
decimal[][] fieldValues = new decimal[inputFileNames.Count][];
for (int i = 0; i < inputFileNames.Count; i++)
{
string currentInputfileName = inputFileNames[i];
string[] currentInputFileLines = File.ReadAllLines(currentInputfileName);
fieldValues[i] = new decimal[currentInputFileLines.Length];
for (int j = 0; j < currentInputFileLines.Length; j++)
{
fieldValues[i][j] = decimal.Parse(currentInputFileLines[j]);
}
}
// Create table
DataTable table = new DataTable();
DataColumn field1Column = table.Columns.Add("field1", typeof (decimal));
DataColumn field2Column = table.Columns.Add("field2", typeof (decimal));
DataColumn field3Column = table.Columns.Add("field3", typeof (decimal));
for (int i = 0; i < fieldValues[0].Length; i++)
{
var newTableRow = table.NewRow();
newTableRow[field1Column.ColumnName] = fieldValues[0][i];
newTableRow[field2Column.ColumnName] = fieldValues[1][i];
newTableRow[field3Column.ColumnName] = fieldValues[2][i];
table.Rows.Add(newTableRow);
}
// Sorting
table.DefaultView.Sort = field1Column.ColumnName;
// Output
foreach (DataRow row in table.DefaultView.ToTable().Rows)
{
foreach (var item in row.ItemArray)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
现在,我尝试将上面的代码保持为LINQ free,因为您似乎没有在您的示例中使用它,因此可能不知道它。话虽这么说,虽然在C#中有一千种方法可以做I / O,LINQ会在这种情况下帮助你很多(而且几乎在任何其他情况下都是如此),所以我建议你查看一下,如果你没有&#39我已经知道了。
此外,我提出的DataTable选项只是为您提供一种以更有效的方式可视化和组织数据的方法。话虽这么说,你绝对没有义务使用DataTable:你可以使用更直接的方法,并使用更常见的数据结构(如列表,数组甚至字典,如果你知道它们是什么)来存储数据,根据您的需要。例如,使用DataTable,您不需要自己进行排序,也不需要处理仅由整数索引的列。随着时间的推移,您将了解C#语言为您提供的无数有用的数据结构和本机功能,以及它们如何在很多情况下帮助您自己完成工作。