下面是一些linqpad测试代码。当该运行它错误,因为“项目”的第二个实例有子项的空列表,而不是一个空列表。

我想治疗以完全相同的方式这两种情况下(null或空单),但我想知道是否有比只是把名单上的空校验和初始化列表为空时,有一个空一个更清洁的方式。

换句话说,我可以这样做:

from si in (i.subitems == null ? new List<item>() : i.subitems)

但这是一个难看一点,我不知道我怎么能提高呢?

public class item
{
    public string itemname { get; set; }
    public List<item> subitems { get; set; }
}

void Main()
{
    List<item> myItemList = new List<item>() 
    {
        new item 
        {
            itemname = "item1",
            subitems = new List<item>()
            {
                new item { itemname = "subitem1" },
                new item { itemname = "subitem2" }
            }
        },
        new item 
        {
            itemname = "item2"
        }
    };

    myItemList.Dump();

    var res = (from i in myItemList
            from si in i.subitems
            select new {i.itemname, subitemname = si.itemname}).ToList();

    res.Dump();
}

作为奖金的问题,可以在此相同LINQ查询被表示为的λ和治疗空值以同样的方式?

干杯,克里斯

有帮助吗?

解决方案

您可以使用空合并运算符

var res = (from i in myItemList
           from si in i.subitems ?? new List<item>()
           select new { i.itemname, subitemname = si.itemname }).ToList();

但我认为你应该只是过滤空的了

var res = (from i in myItemList
           where i.subitems != null
           from si in i.subitems
           select new { i.itemname, subitemname = si.itemname }).ToList();

对于拉姆达的版本,你可以说

var res = myItemList.Where(x => x.subitems != null)
                    .SelectMany(
                        x => x.subitems.Select(
                            y => new { x.itemname, subitemname = y.itemname }
                        )
                     );

但是,查询语法版本的方法更多readble。

其他提示

from si in (i.subitems ?? new List<item>())

怎么样?

您可以添加的(邪恶)扩展方法来为你做的工作。

public static IEnumerable<T> EnsureNotEmpty<T>(this IEnumerable<T> enumerable) {
  if ( enumerable == null ) {
    return Enumerable.Empty<T>();
  } else { 
    return enumerable;
  }
}

的另一种方法将是不允许子项目为空。你可以做的项目构造函数,以便它默认子项目为空列表,然后不允许在子项二传手空。

这当然假设你有访问和修改项目。

在空合并运算符是你正在寻找由亨特戴利指出

什么
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top