LINQ查询更新列表的属性

时间:2014-10-01 05:34:11

标签: c# linq

我正在尝试将以下代码转换为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时,我收到错误。我不确定我在这里做错了什么。

4 个答案:

答案 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>