我有两个清单:
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。我做错了什么?
答案 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 = 真正。我做错了什么?
以下一项或多项:
如果你只想要list_b中不在list_c中的元素:
foreach (comparerobj b in list_b)
{
if (!list_c.Contains(b))
{
data.Add(b);
}
}