我有两个从两个不同文本文件加载数据的哈希集。 两个文本文件的内容如下所示:
name/12441431252132
name1/323244231244142
name2/32423452524234
我的代码目前正在加载这两个文件,并确保我只有textFile2的唯一结果:
HashSet<string> txt1 = new HashSet<string>(File.ReadLines("textFile1.txt"));
HashSet<string> txt2 = new HashSet<string>(File.ReadLines("textFile2.txt"));
txt2.ExceptWith(txt1);
我的问题是,如果整行匹配,它只会根据条件删除行。我想基于名称基础删除它。例如,如果在textFile1中,即使在/之后的id不同,也不应该包括name2。
我将如何实现这一目标?
如果我的解释不好,请告诉我,我会尽力改善它 - 请原谅我的英语!
答案 0 :(得分:3)
你可以添加一些字符串拆分来分隔名称和其他内容 - 这种方法有点“脏”,所以在实际代码中我可能会使用foreach循环并引入专用类:
var content = File.ReadLines("textFile1.txt").Select(line =>
{
var parts = line.Split('/');
return new
{
Name = parts[0],
Content = parts[1]
};
});
HashSet<string> names = new HashSet<string>(content.Select(c=> c.Name));
HashSet<string> txt2 = new HashSet<string>(File.ReadLines("textFile2.txt"));
var uniques = txt2.Where(line => !names.Contains(line.Split('/')[0]));
答案 1 :(得分:0)
如果按/
拆分,则可以构建出现在第一组中的HashSet名称,然后选择第二组中名称未出现在第一组中的项目。
var nameValues1=
File
.ReadLines(fileName)
.Select(line=>line.Split('/'))
.Select(parts=>new {name=parts[0],value=parts[1]});
var nameValues2=
File
.ReadLines(fileName2)
.Select(line=>line.Split('/'))
.Select(parts=>new {name=parts[0],value=parts[1]});
var names1=new HashSet<string>(nameValues1.Select(nv=>nv.name);
var result=
nameValues2
.Where(nv=>!names1.Contains(nv.name))
.Select(nv=>string.Format("{0}/{1}",nv.name,nv.value);
答案 2 :(得分:0)
您确定HashSet
仍然是最佳选择吗?以下是使用Dictionary<String, String>
:
var lines1 = System.IO.File.ReadLines(path1);
var lines2 = System.IO.File.ReadLines(path2);
var allItems = new Dictionary<String, String>();
foreach (var line in lines1.Concat(lines2))
{
String[] tokens = line.Split('/');
if (tokens.Length == 2)
{
String name = tokens[0];
String number = tokens[1];
if (!allItems.ContainsKey(name))
allItems.Add(name, number);
}
}