C#排序,一次返回多个文本文件字符串条目行

时间:2015-05-31 16:16:05

标签: c# string sorting console-application

我有一个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#的业余/新手所以我只能用这样的东西来处理例子。

提前致谢:)

1 个答案:

答案 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#语言为您提供的无数有用的数据结构和本机功能,以及它们如何在很多情况下帮助您自己完成工作。