希望我能解释一下它有意义的地方,但我正试图从主列表中获取一个对象列表,使用一组特殊的复杂(至少是复杂的)标准。
我有一个名为TableInfo的类,它公开了一个ForeignKeyInfo列表。 ForeignKeyInfo有一个名为Table的字符串属性(以及其他)。我需要使用我的TableInfo对象进行一些顺序处理,但只能处理我尚未处理的TableInfo对象。为了跟踪哪些TableInfo对象已被处理,我有一个List,它在处理完成后存储表的名称。
我想循环,直到我的TableInfo集合中的所有项都出现在我的处理列表中。对于循环的每次迭代,我应该处理所有的TableInfo项,其中所有的ForeignKeyInfo.Table字符串都出现在我处理过的List中。
以下是我用“标准”循环代码编写的方法:
while(processed.Count != _tables.Count)
{
List<TableInfo> thisIteration = new List<TableInfo>();
foreach (TableInfo tab in _tables)
{
bool allFound = true;
foreach (ForeignKeyInfo fk in tab.ForeignKeys)
{
allFound = allFound && processed.Contains(fk.Table);
}
if (allFound && !processed.Contains(tab.Name))
{
thisIteration.Add(tab);
}
}
//now do processing using thisIteration list
//variable, "thisIteration", is what I'd like to replace with the result from LINQ
}
答案 0 :(得分:1)
这应该这样做:
var thisIteration = _tables.Where(t => !processed.Contains(t.Name)
&& t.ForeignKeys
.All(fk => processed.Contains(fk.Table));
我假设您只需要迭代thisIteration
集合,在这种情况下将其保留为IEnumerable就可以了。如果您需要它作为列表,您可以在最后输入.ToList()
电话。
答案 1 :(得分:0)
我不确定你在这里要做什么。但是,您可以将循环体转换为以下LINQ查询,如果这样可以使事情变得更简单......
List<TableInfo> thisIteration = (from tab in _tables
let allFound = tab.ForeignKeys.Aggregate(true, (current, fk) => current && processed.Contains(fk.Table))
where allFound && !processed.Contains(tab.Name)
select tab).ToList();