我正在尝试将以下代码转换为linq:
for (int i = 0; i < List.Count;i++ )
{
List[i].IsActive = false;
if(List[i].TestList != null)
{
for(int j = 0;j<List[i].TestList.Count;j++)
{
List[i].TestList[j].IsActive = false;
}
}
}
我尝试了以下查询:
(from s in List select s).ToList().ForEach((s) =>
{
s.IsActive = false;
(from t in s.TestList where t != null select t).ToList().ForEach((t) =>
{
t.IsActive = false;
});
});
但是当列表中的TestList为null时,我收到错误。我不确定我在这里做错了什么。
答案 0 :(得分:1)
您正在选择空列表
where t == null
条件是
where t != null
答案 1 :(得分:1)
如果您的原始(无LINQ)代码有效 然后你错过了一行,在迭代项目
之前检查TestList的null(from s in List select s).ToList().ForEach((s) =>
{
s.IsActive = false;
if(s.TestList != null) //This check of TestList was missing
(from t in s.TestList where t != null select t).ToList().ForEach((t) =>
{
t.IsActive = false;
});
});
答案 2 :(得分:0)
一种简单的方法。无需检查null。
s.ForEach((x)=>
{
x.IsActive = false;
x.TestList.Foreach((t)=>{t.IsActive = false});
});
答案 3 :(得分:0)
您不一定需要内部循环,因为它看起来像是在停用所有嵌套的TestList
项。你可以有两个独立的循环:
foreach(var item in List)
item.IsActive = false;
foreach(var item in List.Where(x => x.TestList != null).SelectMany(x => x.TestList))
item.IsActive = false;
请注意,SelectMany
会将内部列表展平为一个IEnumerable<T>
。