LINQ to Objects List的区别

时间:2010-06-23 20:03:12

标签: c# linq

我有两个EmailAddress通用列表,我想要一种简单的方法来获取List1中不在List2中的所有EmailAddress对象。

我正在考虑与Linq进行某种左外连接,但我对如何设置它有点困惑。我也愿意接受更好的解决方案。

更新:我应该注意到这些是我的“EmailAddress”对象的自定义数据类型列表。

5 个答案:

答案 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();