我遇到了一个逻辑问题,试图从第一个对象的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'查询。
修改 犯了一个错误,但它已经修好了。
答案 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));
}
然后在上面调用它。