使用LINQ返回基于属性的与相关项不同的项

时间:2014-10-04 11:04:34

标签: c# .net linq

所以我有一个对象列表,让我们称之为Elephants。

每个大象对象都有一个名为ClonedFrom的属性。这是Elephant类型,用于指向在图像中创建此新对象的对象。

Elephant类还有一个名为HasTrunk的属性,类型为bool

所以:

public class Elephant
{
      public Elephant ClonedFrom { get; set; }
      public  bool     HasTrunk { get; set; }
}

我们有

   List<Elephant> herd

我想要一个LINQ查询,它会返回任何具有错误HasTrunk属性的Elephants,但也有一个ClonedFrom属性等于HasTrunk属性设置为true的同一列表中的另一个Elephant。

因此,例如,大象A被克隆以创建新的大象B和C

B和C都存在于牧群列表中。 B将HasTrunk设置为false,而C将hasTrunk设置为true。

我想要一个返回B的查询。

2 个答案:

答案 0 :(得分:1)

var results = herd.Where(e => !e.HasTrunk 
                            && e.ClonedFrom != null
                            && e.ClonedFrom.HasTrunk
                            && herd.Contains(e.ClonedFrom));

答案 1 :(得分:0)

问题是你如何检查Clonedfrom父母的平等?你可以在Clonedfrom属性上自我加入,但是你必须检查他们的祖父母。我们应该走多远? 您也可以使用父母的getHashCode检查它们是否具有相同的引用,但我不确定它是否适用于您的情况:

Var results = from h1 in herd
join h2 in herd
on h1.ClonedFrom.getHashCode()
equals
h2.ClonedFrom.getHashCode()
where !h1.hasTrunk && h2.hasTrunk
select h1;