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

本文关键字:数组 两个 并行 读取 一个 拆分 | 更新日期: 2023-09-27 18:27:23

在我的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;
        }
    }
}

我对这最后一项任务感到不知所措。我不知道该怎么办。求你了,如果有人能帮我。。。报时。

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

我真的,真的需要一些帮助。正如我所说,我还需要搜索数组并比较用户输入,所以如果有人知道任何好的"从CSV文件读取到数组中,然后用它做一些数学运算"资源,我也会很高兴被指出这一点。

提前谢谢,如果我同时重复几个问答问题,我深表歉意。

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

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

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

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,传入输入文件的文件名,并将结果存储在变量中。然后数组包含第一个维度作为行索引,第二个维度是数据。要进行搜索,请循环浏览第一个索引,然后检查设备类型的第二个索引。一旦找到它,您就可以查看残值(可能想将其转换为整数以进行比较)。

如果必须查找值,则不应使用数组。为此专门研制了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;

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


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

二维阵列的缺点是所有元素都具有相同的类型。如果必须同时存储文本和数字,这是不理想的,除非您也想将数字存储为文本。或者,您可以创建一个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;
}