在C#中获取唯一/不同的键值对列表

时间:2016-02-22 06:59:42

标签: c# linq list unique key-value

我有一个键值对列表,其中一些值是重复的。我想删除值重复的键值对,只留下一个这样的对。我从SO发布了THIS帖子,但我似乎无法让它正常工作。当我调试时,我在新列表中看到完全相同的列表。完整的类代码如下所示:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace MappingCodeImportHelper
{
    public class CodeMappingHelper
    {
    private List<KeyValuePair<int, string>> TargetJobCodeParallel { get; set; }
    private List<KeyValuePair<int, string>> SourceJobCodeParallel { get; set; }
    private List<KeyValuePair<int, string>> SourceJobCode_Distinct { get; set; }
    private StringBuilder TargetJobCodeOutputString { get; set; }
    private StringBuilder SourceJobCodeOutputString { get; set; }
    private string PathToFiles {get; set;}
    private string SourceFileName { get; set; }
    private string TargetFileName { get; set; }

    public CodeMappingHelper(string sourceJobCodeFileName, string targetJobCodeFileName)
    {
        this.SourceFileName = "\\" + sourceJobCodeFileName;
        this.TargetFileName = "\\" + targetJobCodeFileName;
        this.TargetJobCodeParallel = new List<KeyValuePair<int, string>>();
        this.SourceJobCodeParallel = new List<KeyValuePair<int, string>>();
        this.SourceJobCode_Distinct = new List<KeyValuePair<int, string>>();
    }


    internal void ImportCodesFromFile()
    {
        GetFilePaths();
        ReadInCodesFromFile();
    }

    private void ReadInCodesFromFile()
    {
        var digits = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };          
        using (StreamReader Reader = new StreamReader(PathToFiles + TargetFileName))
        {

            int counter = 0;
            string curLine = "";
            while( (curLine = Reader.ReadLine()) != null) 
            {
                if (curLine.IndexOf('-') == -1)
                    TargetJobCodeParallel.Add(new KeyValuePair<int, string>(counter, curLine.TrimEnd(digits)));
                else
                    TargetJobCodeParallel.Add(new KeyValuePair<int, string>(counter, curLine.Substring(0, curLine.IndexOf('-') + 1).TrimEnd(digits)));

                 ++counter;
            }

        }

        using (StreamReader Reader = new StreamReader(PathToFiles + TargetFileName))
        {
            int counter = 0;
            string curLine = "";
            while ((curLine = Reader.ReadLine()) != null)
            {
                if (curLine.IndexOf('-') == -1)
                    SourceJobCodeParallel.Add(new KeyValuePair<int, string>(counter, curLine.TrimEnd(digits)));
                else
                    SourceJobCodeParallel.Add(new KeyValuePair<int, string>(counter, curLine.Substring(0, curLine.LastIndexOf('-') + 1).TrimEnd(digits)));

                ++counter;
            }
        }
    }

    private void GetFilePaths()
    {
         PathToFiles = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
    }

    internal void MakeDistinctMaster()
    {
        //SourceJobCode_Distinct.AddRange(SourceJobCodeParallel.Where(keyPair => !SourceJobCode_Distinct.Contains(keyPair)));
        SourceJobCode_Distinct = SourceJobCodeParallel.Distinct().ToList();
    }
  }
}

在program.cs文件中,添加以下内容,将源文件名和目标文件名更改为您想要的任何名称。

CodeMappingHelper mappingHelper = new CodeMappingHelper("JobCodeSourceDB.txt", "JobCodeTargetDB.txt");

mappingHelper.ImportCodesFromFile();
mappingHelper.MakeDistinctMaster();

另外,文件必须在bin / debug文件夹中,正如我正在使用的那样:

PathToFiles = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location

在源文件中,添加(示例数据):

CoordHAF01
NurseRXN01
PresCEO01
ResidentialCnsl01
SenSecretary01
VPClinServ01
SeniorCaseMgr01
CoordIntakeClin01
ResidentialCnsl23
ResidentialCnsl24

目标数据库信息与此无关。读入数据后,MakeDistinctMaster()函数运行完毕后,我希望SourceJobCode_Distinct列表保存下面的值,基本上摆脱了第二和第三个ResidentialCnsl:

CoordHAF
NurseRXN
PresCEO
ResidentialCnsl
SenSecretary
VPClinServ
SeniorCaseMgr
CoordIntakeClin

作为旁注,带有.AddRange函数的注释输出行产生相同的结果。有没有明显的理由我不能在MakeDistinctMaster()函数中获得一个明确的列表?

如果你想更全面地了解我的情况 - 如果我正在以一种可怕的方式处理它并且你有一个更好的解决方案 - 客户正在从一个数据库系统转移到另一个数据库系统。我得到了一份工作代码的Excel列表,其中包含来自源DB的一列和将位于目标DB中的第二列目标作业代码。左侧的col映射到右侧col的值,行的行。

但是,无论出于何种原因,当客户在Excel中创建列表时,他们会将每个员工及其源/目标作业代码放入源代码的末尾添加“01”或“02”。 ,但不是目标col。例如,如果“经理”工作中有5个人,则源列将具有“Manager01”,“Manager02”,“Manager03”等...但是目标col只显示“Mngr”,“Mngr” ,“Mngr”等...... 5次。

因此,我不得不截断数字并删除源和目标数据库列中的重复值。当我尝试在Excel中执行不同/唯一的部分时,Excel搞砸了顺序,基本上破坏了映射。这让我转向控制台应用程序。

我决定将两列放入相应的键值对列表中,这样我就可以只对一个列表执行唯一操作,然后只查看该列表中的剩余键(键是从0到n的整数)并应用它到第二个列表并吐出两个文件,其中包含实际映射的最终列表。

有更好/更快/更合理的方法吗?

0 个答案:

没有答案