我有2个列表供我使用。我需要收集不再使用的数据。
例如
清单1:
清单2:
结果数据集必须是。
列表2中未包含的项目:
我希望能够使用以下内容:
var itemsNotInList2 = List2.Except(List1).ToList();
答案 0 :(得分:3)
你在这个例子中处理List<int>
然后你有正确的想法,只是args颠倒了。它应该是;
var itemsNotInList2 = List1.Except(List2).ToList();
想想如何用简单的英语说明这一点。要获得itemsNotInList2
,我想要将List1
中的所有内容包括在内,除了 List2
中的内容。问题中的代码会为您提供List2
但不在List1
中的项目,因为List2
是List1
请注意,此方法通常不适用于引用类型,因为默认的comaparer将比较引用本身。为了对对象进行类似的操作,你必须实现IEqualityComparer
并调用重载,接受它作为它的第三个参数。例如,如果您正在处理List<Person>
而Person
有public string Ssid
,则可以使用Equal
定义return p1.Ssid == p2.Ssid
,并将其用作比较基础。如果需要,可以在msdn上找到相关示例。
public class Person
{
public string Ssid;
// other properties and methods
}
public class PersonSsidEqualityComparer : IEqualityComparer<Person>
{
public bool Equal(Person lhs, Person rhs)
{
return lhs.Ssid == rhs.Ssid
}
public int GetHashCode(Person p)
{
return p.Value.GetHashCode();
}
}
现作为例子;
List<Person> people = new List<Person>();
List<Person> otherPeople = new List<Person>();
Person p1 = new Person("123"); // pretend this constructor takes an ssid
Person p2 = new Person("123");
Person p3 = new Person("124");
Person p4 = p1;
现在使用我在上面设置的数据的一些例子;
people.Add(p1);
people.Add(p3);
otherPeople.Add(p2);
var ThemPeople = people.Except(otherPeople);
// gives you p1 and p3
var ThemOtherPeople = people.Except(otherPeople, new PersonSsidEqualityComparar());
// only gives you p3
otherPeople.Add(p4);
var DoingReferenceComparesNow = people.Except(otherPeople);
// gives you only p3 cause p1 == p4 (they're the same address)
答案 1 :(得分:2)
试试这个
var itemsNotInList2 = List1.Except(List2).ToList();
答案 2 :(得分:1)
如果您要比较对象,则应该提供自己的Equality Comparer。
例如:
public class YourClass
{
public int Value;
}
public class YourClassEqualityComparer : IEqualityComparer<YourClass>
{
public bool Equals(YourClass x, YourClass y)
{
return x.Value == y.Value;
}
public int GetHashCode(YourClass obj)
{
return obj.Value.GetHashCode();
}
}
所以你可以使用Except的重载来获取你的相等比较器的实例:
var list = l1.Except(l2, new YourClassEqualityComparer());