2017-03-02 38 views
0

所以,我想要做的是基于唯一的项目,在这种情况下的“sampleName”映射两个不同文件的内容。其中一个文件的内容先前已添加到字典中,其中包含一个包含属性和sampleName作为关键字的列表。如何将文件的内容映射到现有字典c#

该样品名称也出现在其中具有以下格式第二个文件:

*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尺寸1 size2个Height1身高2

SampleName: SizeOne: SizeTwo: HeightOne: HeightTwo: 
123 364 368 8921 8550 
456 367 0 8948 0 
789 367 0 9475 0 
+0

你能分享你阅读@ user3309936的样本文件吗? –

+0

您所提供的示例不会清除您在代码中实施的逻辑。仍然不清楚 –

+0

第一个示例文件的内容在另一部分代码中实现并保存在字典中。我在这部分阅读的样本具有我的问题中所解释的格式。使用如下的标题:Projectnummer; Datum; wetenschappelijke_naam; zakje(sampleNumber); ring; klantnr。这个标题包含所有信息。我不太确定,如果我明白你想知道什么.. – user3309936

回答

1

很多事情看起来很奇怪的代码:

  • 您使用的是开关/外壳上的布尔变量,而不是if/else
  • 您正在使用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; 
} 

,你应该这样做

你甚至不必更换列表你现在正在设置数据。

+0

这确实解决了我的问题,谢谢! – user3309936