将一个数组拆分为两个并行数组或直接读入C#

时间:2015-12-17 21:47:14

标签: c# arrays

在我的C#课程中,我获得了以下数据文件,用于我当前的作业(控制台程序):

Combine,  1500.00
Oxen,    195.00
Mule,  200.00
Tractor,  4000.00
Truck,  12150.00
Trailer,  475.00

当然,空格是文件的一部分。我无法以任何方式保存或更改数据文件。

我需要将其作为二维数组(或两个并行数组)读取,然后从用户输入对数组进行搜索。该程序应该能够接受以下用户输入:

设备名称,起始值,折旧年限和(如果尚未在阵列中)残值。如果设备没有出现在阵列中,我可以将其视为新设备,如果再次输入该设备,则无需输入残值。

一旦我完成了所有用户输入,我就输出年份和每年的折旧价值。该程序还需要一个用户输入,输出和退出菜单。

我们只在星期三经历了在数组内搜索的例子;期末考试和这项任务都将于周一到期。我一直在搜索这个网站并阅读三个不同的文本大约八个小时,直接试图理解我在做什么,我根本没有得到它(班上只有八个人高于一个70%,所以我做得比大多数好,但仍然是。

这是我到目前为止编写的代码。对于今天,我只是试图获得适当的二维数组。我的问题是,我是否正确实现了一个二维数组,如果是这样,我如何从上面显示的文件中引用每个设备和残值,彼此独立?

public static void GetArrayFromFile()
{
    StreamReader equipmentFile = new StreamReader("SalvageData.TXT");
    string[,] salvageFileArray = new string[1, 6];
    for (int indexCounterA = 0; indexCounterA < 6; indexCounterA++)
    {
        if (equipmentFile.Peek() != -1)
        {
            for (int indexCounterB = 0; indexCounterB < 6; indexCounterB++)
            {
                if (equipmentFile.Peek() != -1)
                {
                    salvageFileArray[indexCounterA, indexCounterB] = equipmentFile.ReadLine();
                }
                else
                {
                    break;
                }
            }
        }
        else
        {
            break;
        }
    }
}

我在最后一次任务中非常关注。我没有IDEA如何继续。拜托,如果有人可以帮我解决这个问题......请加入。

哦是的:没有列表对象,没有char对象,没有正则表达式。这是一门基础入门课程;我们还没有覆盖任何这些,也可能不会使用它们。

我真的非常需要一些帮助。我还需要搜索数组并比较用户输入,正如我所说,所以如果有人知道任何好处&#34;从CSV文件读取到数组然后做一些数学用它&#34;资源,我也很感激被指出。

提前致谢,如果我一次重复几个问答问题,我表示歉意。

2 个答案:

答案 0 :(得分:5)

这是一个有趣的话题,通常家庭作业不受欢迎,但我会帮你指出正确的方向,因为你没有直接询问代码。

首先,您希望从文件中获取数组,因此您需要创建一个能够执行此操作的函数并返回给您一个数组。这使您的函数原型成为

public string[,] GetArrayFromFile(string fileName)

注意我们如何返回二维数组。所以现在你想要读入文件,但是你想把它分成条目数。您希望尝试在不对数组中的元素数量进行硬编码的情况下执行此操作,因为这需要事先了解输入文件(不确定是否允许这样做)。

所以,让我们从一步开始读取整个文件开始:

public string[,] GetArrayFromFile(string fileName)
{
    string[] fileData = File.ReadAllLines(fileName);
}

现在我们知道数组的第一个维度,即行数,第二个维度是2,因为每行有2个元素。所以我们可以创建结果数组:

public string[,] GetArrayFromFile(string fileName)
{
    string[] fileData = File.ReadAllLines(fileName);

    string[,] result = new string[fileData.Length, 2];
}

唯一剩下的就是将fileData拆分为每个元素的单独部分,所以要做到这一点,我们必须使用for循环(可以使用foreach完成,但我怀疑这可能是一个“高级”主题。)

public string[,] GetArrayFromFile(string fileName)
{
    string[] fileData = File.ReadAllLines(fileName);

    string[,] result = new string[fileData.Length, 2];

    for (int i = 0; i < fileData.Length;i++)
    {
        string[] parts = fileData[i].Split(',');
        result[i, 0] = parts[0];
        result[i, 1] = parts[1];  //Probably want to .Trim() here
    }

    return result;
}

现在它成为了从文件中获取数组的整个函数,而不使用硬编码的“魔术”数字。

要使用它,请从调用函数调用传递输入文件文件名的GetArrayFromFile并将结果存储在变量中。然后,数组包含第一个维度作为行索引,第二个维度是数据。要搜索,请遍历第一个索引并检查设备类型的第二个索引。一旦找到它,您就可以查看残值(可能希望将其转换为整数以进行比较)。

答案 1 :(得分:2)

如果必须查找值,则不应使用数组。已经专门为此任务制作了Dictionary<TKey, TValue>。它已经包含一个快速查找算法。

我会像这样阅读文件:

private static Dictionary<string, decimal> ReadSalvageValuesFromFile(string fileName)
{
    string[] lines = File.ReadAllLines(fileName);
    var dict = new Dictionary<string, decimal>()
    foreach (string line in lines) {
        string[] parts = line.Split(',');
        decimal value;
        if (parts.Lengh >= 2 && Decimal.TryParse(parts[1].Trim(), out value)) {
            dict.Add(parts[0].Trim(), value);
        }
    }
    return dict;
}

稍后,您可以检查某个值是否在字典中

Dictionary<string, decimal> salvageValues = ReadSalvageValuesFromFile(@"C:\myFile.txt");
...
decimal salvage;
if (salvageValues.TryGetValue("Mule", out salvage)) {
    // use this value
} else {
    // let user enter new value
}

您还可以使用此类

等新值更新字典
salvageValues["Tractor"] = salvage;

如果条目存在,则将更新该值,否则将创建新条目。

如果必须使用数组,您仍然可以使用上述代码的一些想法。

2-d阵列的缺点是所有元素都具有相同的类型。如果您必须存储文本和数字,这不是理想的,除非您想将数字存储为文本。或者,您可以创建一个object[]数组,允许您以检索项目时所需的价格存储任何类型的数据。

并行2个数组的优势在于它们可以有不同的类型(例如string[]decimal[])。

在任何情况下,您都应该为不同的操作创建方法(子例程)。这使代码更易于阅读并简化了创建主应用程序的任务。

使用Ron Beyer的方法,您现在可以轻松地将文件读入二维数组。

现在您需要一种在数组中查找值的方法。这样做的方法可能如下所示:

private static string LookupSalvage(string[,] salvages, string key)
{
    // Search within array (you seem to know how to do it)
    if (found) {
        return value;
    }

    return null;
}