我的程序有一个CSV配置文件,我在启动时读入并存储到各种数组中供以后使用。它包含两列(现在)配对数据,如下所示:
1,10
2,14
3,11
蓝色,4-10202
红色,4-10001
在该文件的片段中,前三行仅使用一次,我执行以下操作:
int[][] BayPortMap = new int[10][];
for (int i = 0; i < 10; i++)
{
BayPortMap[i] = new int[3];
}
var contents = File.ReadAllLines(@"C:\CSI\MotorTesterConfig.csv");
contents = contents.Where(x =>!string.IsNullOrEmpty(x.Trim(','))).ToArray();
var csv = from line in contents select line.Split(',');
int HeaderRows = 1;
foreach (var row in csv.Skip(HeaderRows))
{
if (csvindex < 10)
{
BayPortMap[csvindex][0] = Convert.ToInt32(row[0]);
BayPortMap[csvindex][1] = Convert.ToInt32(row[1]);
BayPortMap[csvindex][2] = -1;
}
}
现在这是我不喜欢的部分。我对接下来的两行做了同样的事情,但是后来在程序中我需要搜索第二列值,当我找到匹配时,我需要对第一列数据进行操作。因此,当用户扫描一个数字,即4-10002时,返回蓝色,然后对其进行操作。
MotorPNArray[index] = new string[2];
MotorPNArray[index][0] = row[0];
MotorPNArray[index][1] = row[1];
它会起作用但感觉很笨重。我稍后将要编写的另一个程序有许多“数据”列,需要根据匹配的PN来使用。
所以,我应该继续这样做还是使用别的东西,比如List等等。
答案 0 :(得分:0)
使用词典
结束Dictionary<string, string> MotorPNDict = new Dictionary<string, string>();
int csvindex = 0;
int HeaderRows = 1;
foreach (var row in csv.Skip(HeaderRows))
{
if (csvindex < 10)
{
/* Here we get the Bay/Port mapping and store them in ascending order regardless of the CSV order, i.e. bay 1 will always be array position 0*/
var index = Convert.ToInt32(row[0]) - 1;
BayPortMap[index][0] = Convert.ToInt32(row[0]);
BayPortMap[index][1] = Convert.ToInt32(row[1]);
BayPortMap[index][2] = -1;
}
else
{
switch (csvindex)
{
case 10:
{
TesterNumber = row[1];
break;
}
case 11:
{
ReportLocation = row[1];
break;
}
case 12:
{
DBSource = row[1];
break;
}
case 13:
{
InitialCatalog = row[1];
break;
}
default:
{
/* add Motor PNs and there corresponding types to a dictionary */
MotorPNDict.Add(row[1], row[0]);
break;
}
}
}
csvindex++;
}