返回集合中包含任何第一个对象属性的集合

时间:2009-09-23 12:42:07

标签: c# linq

我遇到了一个逻辑问题,试图从第一个对象的personId中包含PersonId的集合中返回一个对象集合。

这听起来非常复杂,但现在是:

//classes
public class MyClass
{
  public List<int> People { get; set; }
}

//Code
List<MyClass> myClasses = new List<MyClass>()
{
  new MyClass()
  {
    People = new List<int>()
    {
      1,
      2
    }
  },
  new MyClass()
  {
    People = new List<int>()
    {
      1
    }
  },
  new MyClass()
  {
    People = new List<int>()
    {
      2
    }
  },
  new MyClass()
  {
    People = new List<int>()
    {
      3,
      4
    }
  },
  new MyClass()
  {
    People = new List<int>()
    {
      4
    }
  }
};

基本上我想返回MyClass的所有实例,其中People包含MyClass第一个实例中人员的任何整数。

一旦我得到它们,我会对它们做一些工作,然后从myClasses中删除它们,然后重新开始直到我返回一个空集合。

因此,我的第一次运行将返回MyClass的前三个实例。我会对它们做一些工作,然后删除它们。

我的第二次运行将返回第四次和第五次(因为前三次被删除将是第一次和第二次)。

这可能吗?我看错了吗?

我认为这会是一种'ContainsAny'查询。

修改 犯了一个错误,但它已经修好了。

1 个答案:

答案 0 :(得分:3)

while (myClasses.Any())
{
    var people = myClasses.First().People;
    var q = from c in myClasses
            where c.People.Any(p => people.Contains(p))
            select c;
    DoWork(q);
    myClasses.RemoveAll(c => q.Contains(c));
}

但是规范存在问题。人们可能是一个空名单。如果这是无效的,那么上面的方法可能会在遇到它时抛出。

替代方法是将它放在静态类中:

public static bool ContainsAny<TSource>(
    this IEnumerable<TSource> source, 
    IEnumerable<TSource> values)
{
    return source.Any(o => values.Contains(o));
}

然后在上面调用它。