关于比较List <T>的问题

Var*_*ica 3 .net c#

我有两个清单:

List<comparerobj> list_c = new List<comparerobj>();
List<comparerobj> list_b = new List<comparerobj>();
Run Code Online (Sandbox Code Playgroud)

我正以某种方式填写清单

然后我试图在list_b中找到list_c不包含的元素:

foreach (comparerobj b in list_b)
{
    bool lc = !list_c.Contains(b);
    if (lc != true)
    {
        data.Add(b);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是对于任何b我都得到那个lc = true.我究竟做错了什么?

Gre*_*g D 11

这有点'但是失去了暂时的布尔.它不是非双重的,而且令人困惑:

foreach (comparerobj b in list_b)
{
    if (list_c.Contains(b))
    {
        data.Add(b);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您已经看到了简化的逻辑,很明显您只添加了两个列表中的项目.单个否定可能在这里有用:

foreach (comparerobj b in list_b)
{
    if (!list_c.Contains(b))
    {
        data.Add(b);
    }
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*sch 5

如果您使用的是.NET 3.5,这很简单:

list_b.Except(list_c);
Run Code Online (Sandbox Code Playgroud)

如果仍然没有正确计算相等性,那么第二个参数Except()IEqualityComparer<T>你可以用来比较你想要的对象,或者你可以覆盖Equals()你的compareobjs.

如果要将值放入新列表(这是我从data变量中收集的),您可以简单地执行此操作:

var data = list_b.Except(list_c).ToList();
Run Code Online (Sandbox Code Playgroud)

编辑:

你提到它不起作用,这可能是因为你没有覆盖Equals()GetHashCode()确定值相等.让您的示例正常工作的最简单方法是使用实​​现IEquatable<T>接口CompareObj:

public class CompareObj : IEquatable<CompareObj>
{
    public bool Equals(CompareObj other)
    {
        // example equality, customize for your object
        return (this.ExampleValue.Equals(other.ExampleValue));
    }
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问MSDN:http://blogs.msdn.com/csharpfaq/archive/2009/03/25/how-to-use-linq-methods-to-compare-objects-of-custom-types. ASPX