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

C# 在C中生成两个列表项的集合差,c#,sorting,lambda,C#,Sorting,Lambda,我有两份清单。我需要收集不再使用的数据 比如说 清单1: 1. 2. 3. 4. 5. 清单2: 1. 2. 4. 5. 6. 需要创建结果数据集 清单2未包括的项目: 3. 我希望使用以下内容: var itemsNotInList2 = List2.Except(List1).ToList(); 在本例中,您处理的是列表,然后您有了正确的想法,只是args颠倒了。应该是, var itemsNotInList2 = List1.Except(List2).ToList(); 想一想如何用

我有两份清单。我需要收集不再使用的数据

比如说

清单1:

1. 2. 3. 4. 5. 清单2:

1. 2. 4. 5. 6. 需要创建结果数据集

清单2未包括的项目:

3. 我希望使用以下内容:

var itemsNotInList2 = List2.Except(List1).ToList();
在本例中,您处理的是列表,然后您有了正确的想法,只是args颠倒了。应该是,

var itemsNotInList2 = List1.Except(List2).ToList();
想一想如何用通俗易懂的英语表达这一点。要获取列表2中的项目,我想获取列表1中的所有内容,除了列表2中的内容。问题中的代码为您提供了列表2中的项目,但列表1中没有这些项目,因为列表2是列表1的子集

请注意,这种方法通常不适用于参考类型,因为默认的comaparer将自己比较参考。为了对对象执行类似的操作,您必须实现IEqualityComparer并调用重载,重载接受它作为第三个参数。例如,如果您正在处理一个列表,并且Person有一个公共字符串Ssid,则可以使用return p1.Ssid==p2.Ssid定义Equal,并将其用作比较的基础。如果您需要,可以在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();
      }
}
在本例中,您处理的是列表,然后您有了正确的想法,只是args颠倒了。应该是,

var itemsNotInList2 = List1.Except(List2).ToList();
想一想如何用通俗易懂的英语表达这一点。要获取列表2中的项目,我想获取列表1中的所有内容,除了列表2中的内容。问题中的代码为您提供了列表2中的项目,但列表1中没有这些项目,因为列表2是列表1的子集

请注意,这种方法通常不适用于参考类型,因为默认的comaparer将自己比较参考。为了对对象执行类似的操作,您必须实现IEqualityComparer并调用重载,重载接受它作为第三个参数。例如,如果您正在处理一个列表,并且Person有一个公共字符串Ssid,则可以使用return p1.Ssid==p2.Ssid定义Equal,并将其用作比较的基础。如果您需要,可以在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();
      }
}
试试这个

var itemsNotInList2 = List1.Except(List2).ToList();
试试这个

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

如果要比较对象,可能需要提供自己的

例如:

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();
    }
}

如果要比较对象,可能需要提供自己的

例如:

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();
    }
}

将其反转:var itemsNotInList2=List1.ExceptList2.ToList;对于任何想看到IEqualityComparer示例和对其的精彩解释的人。将其反转:var itemsNotInList2=List1.ExceptList2.ToList;对于任何想看到IEqualityComparer示例和对其的精彩解释的人。我明白了,我实际上是在使用对象,你能给我指一个msdn上的例子或给我看一个概念证明吗?@Bradylies我更新了一个使用对象并实现IEqualityComparar的例子。请注意,您可以在不实现IEqualityComparar的情况下组合其他一些LINQ操作符来获得相同的结果,只需使用Exception即可。哇,您真的全力以赴了。非常感谢你的帮助!!!我也明白为什么这也是必要的。我明白了,我实际上是在使用对象,你能给我指一个msdn上的例子或给我看一个概念证明吗?@Bradylies我更新了一个使用对象并实现IEqualityComparar的例子。请注意,您可以在不实现IEqualityComparar的情况下组合其他一些LINQ操作符来获得相同的结果,只需使用Exception即可。哇,您真的全力以赴了。非常感谢你的帮助!!!我也完全理解为什么这也是必要的。