C# 在C语言中,将一个数组拆分为两个并行数组或直接读入两个数组#

C# 在C语言中,将一个数组拆分为两个并行数组或直接读入两个数组#,c#,arrays,C#,Arrays,在我的C#课程中,为我当前的作业(控制台程序)提供了以下数据文件: 当然,空格是文件的一部分。我无法以任何方式保存或更改数据文件 我需要将其作为二维数组(或两个并行数组)读入,然后根据用户输入对该数组进行搜索。程序应该能够接受以下用户输入: 设备名称、起始值、折旧年限和残值(如果不在数组中)。如果设备没有出现在数组中,我会将其视为一个新设备,如果再次输入该设备,则不必输入残值 一旦我有了所有的用户输入,我就要输出年份和每年的折旧值。程序还需要一个用于用户输入、输出和退出的菜单 我们只是在周三讨论

在我的C#课程中,为我当前的作业(控制台程序)提供了以下数据文件:

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

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

设备名称、起始值、折旧年限和残值(如果不在数组中)。如果设备没有出现在数组中,我会将其视为一个新设备,如果再次输入该设备,则不必输入残值

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

我们只是在周三讨论了在数组中搜索的示例;期末考试和作业都要在星期一交。我一直在搜索这个网站,连续八个小时阅读三篇不同的文章,试图理解我在做什么,但我一点也不明白(班上只有八个人的分数高于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;
        }
    }
}
公共静态void GetArrayFromFile()
{
StreamReader设备文件=新的StreamReader(“SalvageData.TXT”);
字符串[,]salvageFileArray=新字符串[1,6];
对于(int indexCounterA=0;indexCounterA<6;indexCounterA++)
{
如果(equipmentFile.Peek()!=-1)
{
对于(int indexCounterB=0;indexCounterB<6;indexCounterB++)
{
如果(equipmentFile.Peek()!=-1)
{
salvageFileArray[indexCounterA,indexCounterB]=equipmentFile.ReadLine();
}
其他的
{
打破
}
}
}
其他的
{
打破
}
}
}
我对最后一项任务非常恼火。我不知道如何进行。拜托,如果有人能帮我。。。插话

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

我真的,真的需要一些帮助。我还需要搜索数组并比较用户输入,正如我所说的,因此,如果有人知道任何好的“从CSV文件读入数组,然后用它做一些数学运算”资源,我也希望有人指出这一点


提前谢谢,如果我同时重复了几个问题,我表示歉意

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

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

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
,但我怀疑这可能是一个“高级”主题)

公共字符串[,]GetArrayFromFile(字符串文件名)
{
字符串[]fileData=File.ReadAllLines(文件名);
字符串[,]结果=新字符串[fileData.Length,2];
for(int i=0;i
它现在成为您从文件中获取数组的全部函数,而不使用硬编码的“魔法”数字


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

如果必须查找值,则不应使用数组。专门为这项任务制作了一本
词典
。它已经包含了一个快速查找算法

我会这样读文件:

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;
}
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;
}
如果条目存在,则将更新该值,否则将创建一个新条目


如果必须使用数组,那么仍然可以使用上面代码的一些思想

二维阵列的缺点是所有元素的类型都相同。如果您必须同时存储文本和数字,这并不理想,除非您希望同时存储数字和文本。或者您可以创建一个
object[]
数组,允许您存储任何类型的数据,其价格与您在重新创建项目时所需的价格相同
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;
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;
}