我有两个清单:
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)
如果您使用的是.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