Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-检查IEnumerable中的空值<;T>;不同类型_C#_.net_Collections - Fatal编程技术网

C#-检查IEnumerable中的空值<;T>;不同类型

C#-检查IEnumerable中的空值<;T>;不同类型,c#,.net,collections,C#,.net,Collections,如何检查IEnumerable上的空值,其中T可以是引用类型,也可以是Nullable类型 我在方法中接收一个对象参数,该参数可以是IEnumerable或IEnumerable或IEnumerable等等(它也可以是非集合类型…因此是对象类型)。我需要检查空值 所以我尝试了类似于value是IEnumerable objValue&&objValue.Contains(null)的方法,但这只适用于引用类型。当它是一个可空的时,它不起作用,因为在值类型上缺乏协方差 有没有一种方法可以解决这个问

如何检查
IEnumerable
上的空值,其中T可以是引用类型,也可以是
Nullable
类型

我在方法中接收一个
对象
参数,该参数可以是
IEnumerable
IEnumerable
IEnumerable
等等(它也可以是非集合类型…因此是
对象
类型)。我需要检查空值

所以我尝试了类似于
value是IEnumerable objValue&&objValue.Contains(null)
的方法,但这只适用于引用类型。当它是一个
可空的
时,它不起作用,因为在值类型上缺乏协方差


有没有一种方法可以解决这个问题而不必诉诸大量的反射?

我会让您当前的方法只处理非集合类型。创建一个新方法,该方法接受IEnumerable来处理集合检查


至于检查空值,为什么不只做x==null或Object.Equals(x,null)?

您可以为您需要的每种情况使用自己的重载方法

public void DoSomethingWith(IEnumerable<string> values)
{
    var notNullValues = values.Where(value => value != null).ToArray();

    // Do something with not null values
}

public void DoSomethingWith(IEnumerable<Nullable<T>> values)
{
    var notEmptyValues = values.Where(value => value.HasValue).ToArray();

    // Do something with not null values
}
public void DoSomethingWith(IEnumerable值)
{
var notNullValues=values.Where(value=>value!=null).ToArray();
//使用非空值执行某些操作
}
公共void DoSomethingWith(IEnumerable值)
{
var notEmptyValues=values.Where(value=>value.HasValue.ToArray();
//使用非空值执行某些操作
}

一个相当简单的方法是利用
IEnumerable
接口继承了非通用的
IEnumerable
接口这一事实:

value is IEnumerable enumerable && enumerable.Cast<object>().Contains(null)
值为IEnumerable enumerable&&enumerable.Cast().Contains(null)
然而,这是一个相当低效的实现,因为值类型集合中的所有项都将被装箱,即使它们不可为null,这可能是一个性能问题,具体取决于集合的大小和执行此代码的频率