在C#中生成两个列表项的集合差异

时间:2015-04-01 19:17:07

标签: c# sorting lambda

我有2个列表供我使用。我需要收集不再使用的数据。

例如

清单1:

  • 1
  • 2
  • 3
  • 4
  • 5

清单2:

  • 1
  • 2
  • 4
  • 5
  • 6

结果数据集必须是。

列表2中未包含的项目:

  • 3

我希望能够使用以下内容:

var itemsNotInList2 = List2.Except(List1).ToList();

3 个答案:

答案 0 :(得分:3)

你在这个例子中处理List<int>然后你有正确的想法,只是args颠倒了。它应该是;

var itemsNotInList2 = List1.Except(List2).ToList();

想想如何用简单的英语说明这一点。要获得itemsNotInList2,我想要将List1 中的所有内容包括在内,除了 List2中的内容。问题中的代码会为您提供List2但不在List1中的项目,因为List2List1

的子集,所以这些项目都没有

请注意,此方法通常不适用于引用类型,因为默认的comaparer将比较引用本身。为了对对象进行类似的操作,你必须实现IEqualityComparer并调用重载,接受它作为它的第三个参数。例如,如果您正在处理List<Person>Personpublic 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());