当一个为空时,Concat 2列出

use*_*082 5 c# list concatenation

当填写代码行下面的两个列表时,我的代码工作正常.但是错误"值不能为空".当LstNewItems设置为null时发生.为什么以及如何解决这个问题,或者我必须事先检查每个列表是否为空并采取相应措施?

this.radGridViewFiles.BeginInvoke((MethodInvoker)(
() => this.radGridViewFiles.DataSource = MyGlobals.ListOfItemsToControl
                                                  .Concat(MyGlobals.lstNewItems)
                                                  .ToList()
));
Run Code Online (Sandbox Code Playgroud)

Rud*_*dis 12

您可以使用

MyGlobals.lstNewItems ?? Enumerable.Empty<someObjectType>()
Run Code Online (Sandbox Code Playgroud)

  • 如果它是匿名类型的列表;) (3认同)

pan*_*nts 8

当您有任意数量的可能为空的集合要连接时:

IEnumerable<T> Concat<T>(params IEnumerable<T>[] nullableCollections)
{
    return nullableCollections.Where(nc => nc != null).SelectMany(nc => nc);
}
Run Code Online (Sandbox Code Playgroud)

稍后您可以致电:

IEnumerable<T> allElements = Concat(myElements, yourElements, theirElements);
Run Code Online (Sandbox Code Playgroud)

不用担心其中任何一个是否为空。


Mik*_*sen 5

我所做的是创建一个扩展方法,如果枚举为空,它可以创建一个空列表:

public static IEnumerable<T> NeverNull<T>(this IEnumerable<T> value)
{
   return value ?? Enumerable.Empty<T>();
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

this.radGridViewFiles.BeginInvoke((MethodInvoker)(
() => this.radGridViewFiles.DataSource = MyGlobals.ListOfItemsToControl
                                                  .Concat(MyGlobals.lstNewItems.NeverNull())
                                                  .ToList()
));
Run Code Online (Sandbox Code Playgroud)

例子

  • 我的错误,你会得到另一个参数空异常,而不是 NRE。所以这对于 OP 的代码来说同样是个问题。 (4认同)
  • @Servy - 错了。`DefaultIfEmpty` 本身就是一个扩展方法,因此在 null 上调用它是完全没问题的。我在我的几个项目中使用了这段代码。 (2认同)

Ser*_*rvy 5

如果可能的话,永远不要让自己处于列表所在的位置null,这样你就不需要以不同的方式检查null和处理这种情况.有一个空列表而不是null几乎总是更好.