所以,我想要做的是根据一个唯一的项目映射两个不同文件的内容,在这种情况下是“sampleName”。其中一个文件的内容之前已添加到字典中,其中包含一个包含属性的列表和一个sampleName作为键。
此样本名称也出现在第二个文件中,该文件具有以下格式:
*Projectnummer;Datum;wetenschappelijke_naam;zakje;ring;klantnr
"aNumber";"aDate";"scientificName";"123456";"12";"aNumber" etc..*
其中“123456”是sampleName,这也发生在上一个字典中。
问题在这里,使用当前代码将错误的项添加到字典中的错误sampleCode(correctSamplesDict)。添加信息不是基于匹配的样本编号,而是基于文件中行的顺序。
如何我可以检查样本名称是否匹配,从而需要添加哪些信息?
try
{
if (File.Exists(fileName))
{
bool headerCollected = false;
int projectNumberId = -1;
int dateId = -1;
int scientificNameId = -1;
int sampleNameId = -1;
int ringId = -1;
int customerIdId = -1;
StreamReader reader = new StreamReader(fileName);
while (reader.Peek() > 4)
{
Sample sample = new Sample();
string line = reader.ReadLine();
line = line.Replace("\"" , string.Empty);
string[] lineParts = line.Split((char)59);
switch (headerCollected)
{
case false:
if (line.ToUpper().Contains("PROJECTNUMMER"))
{
for (int i = 0; i < lineParts.Length; i ++)
{
if (lineParts[i].ToUpper().Trim().Contains("DATUM")) { dateId = i; }
if (lineParts[i].ToUpper().Trim().Contains("WETENSCHAPPELIJKE_NAAM")) { scientificNameId = i; }
if (lineParts[i].ToUpper().Trim().Contains("ZAKJE")) { sampleNameId = i; }
if (lineParts[i].ToUpper().Trim().Contains("RING")) {ringId = i; }
if (lineParts[i].ToUpper().Trim().Contains("KLANTNR")) { customerIdId = i; }
if (lineParts[i].ToUpper().Trim().Contains("PROJECTNUMMER")) { projectNumberId = i; }
}
headerCollected = true;
}
break;
case true:
if (dateId != -1 && lineParts.Length > dateId) { sample.ProjectDate = lineParts[dateId].Trim(); }
if (sampleNameId != -1 && lineParts.Length > sampleNameId) { sample.SampleName = lineParts[sampleNameId].Trim(); }
if (customerIdId != -1 && lineParts.Length > customerIdId) { int.TryParse(lineParts[customerIdId].Trim(), out sample.CustomerNumber); }
if (projectNumberId != -1 && lineParts.Length > projectNumberId) { sample.ProjectNumber = lineParts[projectNumberId].Trim(); }
if (ringId != -1 && lineParts.Length > ringId) { sample.RingNumber = lineParts[ringId].Trim(); }
if (scientificNameId != -1 && lineParts.Length > scientificNameId) { sample.ScientificName = lineParts[scientificNameId].Trim(); }
List<Sample> sampleProperties = null;
Sample sampleVal = null;
if (correctSamplesDict.TryGetValue(sample.SampleName, out sampleProperties))
{
foreach (KeyValuePair<string, List<Sample>> items in correctSamplesDict)
{
foreach (Sample sampleValue in items.Value)
{
// initializes a new object for each iteration
sampleVal = new Sample();
sampleProperties = new List<Sample>();
// These values still are correct sampleVal.HeightOne = sampleValue.HeightOne;
sampleVal.HeightTwo = sampleValue.HeightTwo;
sampleVal.SizeOne = sampleValue.SizeOne;
sampleVal.SizeTwo = sampleValue.SizeTwo;
sampleVal.SampleName = sampleValue.SampleName;
// mapping goes wrong here (wrong sample information to the wrong sampleName)
sampleVal.ProjectDate = sample.ProjectDate;
sampleVal.ProjectNumber = sample.ProjectNumber;
sampleVal.CustomerNumber = sample.CustomerNumber;
sampleVal.RingNumber = sample.RingNumber;
sampleVal.ScientificName = sample.ScientificName;
sampleProperties.Add(sampleVal);
}
}
correctSamplesDict[sampleVal.SampleName] = sampleProperties;
}
break;
default:
break;
}
}
}
}
修改 示例文件如下所示: Sample_Name Size1 Size2 Height1 Height2
SampleName: SizeOne: SizeTwo: HeightOne: HeightTwo:
123 364 368 8921 8550
456 367 0 8948 0
789 367 0 9475 0
答案 0 :(得分:1)
你的代码中很多东西都很奇怪:
Dictionary<string, List<<Sample>>
时(根据我的理解),您使用Dictionary<string, List<<Sample>>
来存储数据。除此之外,您的问题来自代码的这一部分:
Dictionary<string, Sample>
你应该这样做
if (correctSamplesDict.TryGetValue(sample.SampleName, out sampleProperties))
{
foreach (KeyValuePair<string, List<Sample>> items in correctSamplesDict)
{
foreach (Sample sampleValue in items.Value)
{
//skip...
}
}
correctSamplesDict[sampleVal.SampleName] = sampleProperties;
}
您甚至不必替换字典中的列表,因为您现在直接在其中设置数据。