【问题标题】:How to map content of a file to an exisiting dictionary c#如何将文件的内容映射到现有字典c#
【发布时间】:2017-07-21 22:41:50
【问题描述】:

所以,我要做的是根据一个独特的项目(在本例中为“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

【问题讨论】:

  • 你能分享你阅读@user3309936的示例文件吗?
  • 您提供的示例无法清除您在代码中实现的逻辑。还不清楚
  • 第一个示例文件的内容在另一部分代码中实现并保存在字典中。我在这部分中阅读的示例具有我的问题中解释的格式。标题看起来像: Projectnummer;Datum;wetenschappelijke_naam;zakje(sampleNumber);ring;klantnr 。该标题包含所有信息。我不太确定我是否了解您想知道的内容..

标签: c# file dictionary mapping


【解决方案1】:

您的代码中有很多地方看起来很奇怪:

  • 您在布尔变量上使用 switch/case,而不是 if/else
  • 您使用Dictionary&lt;string, List&lt;&lt;Sample&gt;&gt; 来存储您的数据,而您只能使用Dictionary&lt;string, Sample&gt;(据我了解)。

除此之外,您的问题来自您的这部分代码:

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;
}

你应该在哪里做这个

if (correctSamplesDict.TryGetValue(sample.SampleName, out sampleProperties))
{
    foreach (Sample sampleValue in sampleProperties)
    {
        sampleValue.ProjectDate = sample.ProjectDate;
        sampleValue.ProjectNumber = sample.ProjectNumber;
        sampleValue.CustomerNumber = sample.CustomerNumber;
        sampleValue.RingNumber = sample.RingNumber;
        sampleValue.ScientificName = sample.ScientificName;
    }
}

您甚至不必替换字典中的列表,因为您现在可以直接在其中设置数据。

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多