如何得到C#中两个列表的差异?

如何得到C#中两个列表的差异?,c#,linq,list,linq-to-objects,C#,Linq,List,Linq To Objects,好的,我有两个C语言的列表# 我现在必须进行比较,看看哪些歌曲不在属性名称中,例如 songs.Add("something"); songs.Add("another"); songs.Add("yet another"); Attribute a = new Attribute("500", "http://google.com", "something" ); attributes.Add(a); 我想要一种返回“另一个”和“又一个”的方法,因为它们不在属性列表名称中 伪代码也是

好的,我有两个C语言的列表#

我现在必须进行比较,看看哪些歌曲不在属性名称中,例如

songs.Add("something"); 
songs.Add("another"); 
songs.Add("yet another");

Attribute a = new Attribute("500", "http://google.com", "something" ); 
attributes.Add(a);
我想要一种返回“另一个”和“又一个”的方法,因为它们不在属性列表名称中

伪代码也是如此

difference = songs - attributes.names
编辑


添加ToList()使其成为列表

这是查找属性名称中未包含的所有歌曲的方法:

var diff = songs.Except(attributes.Select(a => a.name)).ToList();
var result = songs
  .Where(!attributes.Select(a => a.name).ToList().Contains(song));
使用Except的答案也很完美,可能更有效


编辑:如果您在LINQtoSQL中使用sintax,它有一个优点:它将转换为
而不是
SQL谓词<代码>除了
在SQL中不会转换为任何内容。因此,在这种情况下,所有记录都将从数据库中恢复,但在应用程序端除外,这样效率要低得多。

值得指出的是,此处发布的答案将返回
歌曲的列表,这些歌曲不在
attributes.names
中,但是它不会给你一个
属性的列表。
歌曲中没有名字

虽然这是OP想要的,但标题可能有点误导,特别是如果(像我一样)你来这里是想寻找一种方法来检查两个列表的内容是否不同。如果这是您想要的,您可以使用以下选项:-

var differences = new HashSet(songs);
differences.SymmetricExceptWith(attributes.Select(a => a.name));
if (differences.Any())
{
    // The lists differ.
}

可枚举的。如果需要,请使用ToList()。对不起,Adrian,请告诉我。这其实是一个很好的答案,我自己也一直在想如何实现这一点+1如果使用除
之外的
的其他答案都是完美且更有效的,你为什么要发布此消息?如果你看到了,我会在其他答案之前发布此消息,然后添加评论,明确说明其他解决方案更好。“我在其他答案之前发布此消息。”你没有。是的,我缺少右括号。但看看《华盛顿邮报》:我的27分钟前,20分钟前编辑;爱奥尼登25分钟前;24分钟前我的。但我可以看出这冒犯了你,我将删除它。嘿,投票系统在这里,让人们知道哪一个是最好的答案。这就是我投阿德里安票的原因。不过,我认为看到不同的选择不会有什么坏处。我的至少有一个优势。请参阅我编辑的答案。
var diff = songs.Except(attributes.Select(a => a.name)).ToList();
var result = songs
  .Where(!attributes.Select(a => a.name).ToList().Contains(song));
var differences = new HashSet(songs);
differences.SymmetricExceptWith(attributes.Select(a => a.name));
if (differences.Any())
{
    // The lists differ.
}