If you're using .NET 3.5 this is simple:
list_b.Except(list_c);
If that's still not calculating equality correctly, the 2nd parameter to Except() is an IEqualityComparer<T> which you can then use to compare your objects however you wish, or you could just override Equals() for your compareobjs.
If you want to put the values into a new list (which is what I gather from the data variable), you can simply do this:
var data = list_b.Except(list_c).ToList();
Edit:
You mention that it doesn't work, and this is likely because you haven't overridden Equals() and GetHashCode() to determine value equality. The easiest way to get your example working is to use implement the IEquatable<T> interface on your CompareObj:
public class CompareObj : IEquatable<CompareObj>
{
public bool Equals(CompareObj other)
{
// example equality, customize for your object
return (this.ExampleValue.Equals(other.ExampleValue));
}
}
More information can be found on MSDN: http://blogs.msdn.com/csharpfaq/archive/2009/03/25/how-to-use-linq-methods-to-compare-objects-of-custom-types.aspx