当一个为空时,Concat 2列出

时间:2014-01-31 21:53:24

标签: c# list concatenation

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

this.radGridViewFiles.BeginInvoke((MethodInvoker)(
() => this.radGridViewFiles.DataSource = MyGlobals.ListOfItemsToControl
                                                  .Concat(MyGlobals.lstNewItems)
                                                  .ToList()
));

6 个答案:

答案 0 :(得分:10)

您可以使用

MyGlobals.lstNewItems ?? Enumerable.Empty<someObjectType>()

答案 1 :(得分:5)

如果可能的话,永远不要让自己处于列表为null的位置,这样您就不需要检查null并以不同方式处理该案例。有一个空列表而不是null几乎总是可取的。

答案 2 :(得分:4)

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

public static IEnumerable<T> NeverNull<T>(this IEnumerable<T> value)
{
   return value ?? Enumerable.Empty<T>();
}

然后你可以这样做:

this.radGridViewFiles.BeginInvoke((MethodInvoker)(
() => this.radGridViewFiles.DataSource = MyGlobals.ListOfItemsToControl
                                                  .Concat(MyGlobals.lstNewItems.NeverNull())
                                                  .ToList()
));

Example

答案 3 :(得分:2)

试试这个

 ( MyGlobals.ListOfItemsToControl ?? new List<Type>()).Concat(MyGlobals.lstNewItems ?? new List<Type>()) .ToList()

答案 4 :(得分:1)

在连接之前检查null。等,

if(MyGlobals.lstNewItems != null)
{
MyGlobals.ListOfItemsToControl.AddRange(MyGlobals.lstNewItems);
}

答案 5 :(得分:1)

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

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

,稍后您可以致电:

IEnumerable<T> allElements = Concat(myElements, yourElements, theirElements);

不用担心它们是否为空。