我有两个EmailAddress通用列表,我想要一种简单的方法来获取List1中不在List2中的所有EmailAddress对象。
我正在考虑与Linq进行某种左外连接,但我对如何设置它有点困惑。我也愿意接受更好的解决方案。
更新:我应该注意到这些是我的“EmailAddress”对象的自定义数据类型列表。
答案 0 :(得分:9)
您可以使用除了linq方法:
var list1 = // First list generation
var list2 = // Second list generation
var result = list1.Except(list2);
答案 1 :(得分:2)
这些答案中的大部分都不起作用,因为List1和List2中的项目在用户眼中可能相同,但实际上是对不同实例的引用(它们不是引用相等)。
假设Address是EmailAddress的字符串属性,这里是左连接解决方案。
IEnumerable<EmailAddress> query =
from a1 in list1
join a2 in list2 on a1.Address equals a2.Address into g
from x in g.DefaultIfEmpty()
where x == null
select a1;
答案 2 :(得分:1)
嗯,我相信人们会来这里给你一个更时尚的LINQesque例子,但我的雇主只允许我们使用.NET 2.0,所以......
List<EmailAddress> ret = new List<EmailAddress>( );
foreach ( EmailAddress address in List1 )
{
if( !List2.Contains( address ) )
{
ret.Add( address );
}
}
以下是覆盖可能适用于您的.Equals方法的示例。
class EmailAddress
{
public string Address { get; set; }
public override bool Equals( object o )
{
EmailAddress toCheck = o as EmailAddress;
if( toCheck == null ) return false;
// obviously this is a bit contrived, but you get the idea
return ( this.Address == toCheck.Address );
}
// override GetHashCode as well when overriding Equals
}
答案 3 :(得分:0)
list1.Except(list2);
编辑:示例here。
答案 4 :(得分:0)
List<String> list1 = new List<string>();
List<String> list2 = new List<string>();
List<String> list3 = list1.Except(list2).ToList();