关于比较List <t> </t>的问题

时间:2010-03-19 13:30:48

标签: c# .net

我有两个清单:

List<comparerobj> list_c = new List<comparerobj>();
List<comparerobj> list_b = new List<comparerobj>();

我正以某种方式填写名单

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

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

但是对于任何b我都得到了lc = true。我做错了什么?

6 个答案:

答案 0 :(得分:11)

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

foreach (comparerobj b in list_b)
{
    if (list_c.Contains(b))
    {
        data.Add(b);
    }
}

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

foreach (comparerobj b in list_b)
{
    if (!list_c.Contains(b))
    {
        data.Add(b);
    }
}

答案 1 :(得分:5)

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

list_b.Except(list_c);

如果仍然无法正确计算相等性,Except()的第二个参数是IEqualityComparer<T>,您可以根据需要使用它来比较对象,或者只是覆盖Equals()为您的compareobjs

如果您想将值放入新列表(我从data变量中收集),您可以这样做:

var data = list_b.Except(list_c).ToList();

编辑:

您提到它不起作用,这可能是因为您没有覆盖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));
    }
}

可以在MSDN上找到更多信息:http://blogs.msdn.com/csharpfaq/archive/2009/03/25/how-to-use-linq-methods-to-compare-objects-of-custom-types.aspx

答案 2 :(得分:4)

您的对象如何比较?默认情况下,.NET框架通过引用比较对象。例如,如果您创建以下类:

class A
{
    string Name { get; set; }
}

以及后续代码

A a1 = new A() { Name = "a" };
A a2 = new A() { Name = "a" };

然后你会发现这些对象是不同的。

您需要覆盖.NET Framework的Equals方法,将上述对象视为相等。

答案 3 :(得分:2)

你反转了两次布尔值。在!list_...执行第一行时,执行lc != true时执行第二行。

请改为尝试:

bool itemExistsInC = list_c.Contains(b);
if (!itemExistsInC){

答案 4 :(得分:2)

你正在使用!操作员两次。 此外,在此上下文中,您不需要显式声明bool。 试试这个:

foreach (object b in list_b)
{
    if (!list_c.Contains(b))
    {
        data.Add(b);
    }
}

答案 5 :(得分:1)

使用linq

list_b.Except(list_c).ToList().ForEach(data.Add);
  

但是对于任何b我都得到了lc =   真正。我做错了什么?

以下一项或多项:

  • 你的装置完全不同。
  • comparerobj需要重载Equals()方法
  • 您使用的逻辑令人困惑,无法按预期工作。

如果你只想要list_b中不在list_c中的元素:

foreach (comparerobj b in list_b)
{
    if (!list_c.Contains(b))
    {
        data.Add(b);
    }
}