我需要开发一个比较两个csv文件的应用程序。第一个文件包含电子邮件地址列表。第二个列表也有电子邮件地址,但包括姓名和地址信息。第一个列表包含需要从第二个列表中删除的电子邮件地址。我有CodeProject网站的Fast CSV阅读器,效果很好。应用程序将无法访问数据库服务器。将生成一个新文件,其中包含被认为已验证的数据。意思是,它不包含第一个文件中的任何信息。
答案 0 :(得分:2)
如果您将两个列表都读入集合,则可以使用Linq来确定地址子集。
这是我为你掀起的一个快速示例课程。
using System;
using System.Linq;
using System.Collections.Generic;
public class RemoveExample
{
public List<Item> RemoveAddresses(List<Item> sourceList, List<string> emailAddressesToRemove)
{
List<Item> newList = (from s in sourceList
where !emailAddressesToRemove.Contains(s.Email)
select s).ToList();
return newList;
}
public class Item
{
public string Email { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
}
要使用它,请将csv读入List,然后将其传递,并将地址列表作为List删除到方法中。
答案 1 :(得分:1)
不确定您需要什么样的建议,听起来很直接。
这是一个快速的算法草图:
答案 2 :(得分:1)
这是相对简单的,假设列表不是非常大或内存使用不是一个过大的问题:在两个单独的HashSet<string>
实例中读取两组电子邮件地址。然后,您可以使用HashSet<T>.ExceptsWith
查找两组之间的差异。例如:
HashSet<string> setA = ...;
HashSet<string> setB = ...;
setA.ExceptWith(setB); // Remove all strings in setB from setA
// Print all strings that were in setA, but not setB
foreach(var s in setA)
System.Console.WriteLine(s);
BTW,上面应该是O(n * log(n))复杂度,而不是使用Linq答案,这对非索引数据来说是O(n ^ 2)。