我有两个文件:
文件1.txt
abc@ewr.com
xyc@df.co.nz
rte@pope.com
ssddsf@fdf.com
文件2.txt
rgt@ewr.com
xyc@df.co.nz
rte@pope.com
abc@fdf.com
sert@fd.com
tiffer@fg.com
我想首先检测重复,然后从File1中删除重复。
怎么做。
答案 0 :(得分:1)
如果您同时阅读他们自己的List<string>
,那么您可以这样做:
// file1 is a List<string> representing each line of file1
// file2 is a List<string> representing each line of file2
List<string> file1WithoutDupes = (from line in file1
where !file2.Contains(line)
select line).ToList();
你最终不会合并这两个名单。
答案 1 :(得分:0)
另一个解决方案是使用哈希表。
从具有keys =文件条目的哈希表中的第一个文件加载条目。 然后在从第二个文件插入条目之前检查密钥是否已经存在。
答案 2 :(得分:0)
如果您还没有列表中文件的内容,请按以下步骤操作:
var file1 = File.ReadAllLines(file1Path);
var file2 = File.ReadAllLines(file2Path);
var dupes = Array.FindAll(file1, line =>
Array.Exists(file2, line2 => line2 == line));
var noDupes = Array.FindAll(file1, line =>
!Array.Exists(dupes, line2 => line2 == line));
File.WriteAllLines(file1Path, noDupes); // write back to file1
但是,如果你将file1和file2的内容存储在List<string>
中,你可以写:
// Option #1: LINQ, returns results
var dupes = file1.Intersect(file2);
var noDupes = file1.Except(dupes);
File.WriteAllLines(file1Path, noDupes.ToArray());
// Option #2: generic collection methods
List<string> dupes = file1.FindAll(item => file2.Contains(item));
file1.RemoveAll(item => dupes.Contains(item)); // affects original list
File.WriteAllLines(file1Path, file1.ToArray());
在.NET 4.0中,您应该能够使用返回IEnumerable<string>
的{{3}},并且比File.ReadAllLines返回的字符串数组具有更大的灵活性。此外,File.ReadLines method已超载以接受IEnumerable<string>
,这样我们就可以放弃在上述代码段中看到的ToArray()
来电。
编辑请注意,在两个代码示例中,您都可以跳过dupes部分,直接使用file2
代替dupes
变量确定noDupes的结果分别是Array和LINQ方法。如果你需要参考傻瓜,我把它留在了里面。
答案 3 :(得分:0)
如果我理解正确,你想要文件1中不存在于文件2中的行。试试这个:
var lines1=File.ReadAllLines("File1.txt");
var lines2=File.ReadAllLines("File2.txt");
var file1OnlyLines=lines1.Except(lines2).ToList();