我有一个键值对列表,其中一些值是重复的。我想删除值重复的键值对,只留下一个这样的对。我从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的整数)并应用它到第二个列表并吐出两个文件,其中包含实际映射的最终列表。
有更好/更快/更合理的方法吗?