如何避免在foreach体中进行空检查?

时间:2014-01-02 18:56:24

标签: c# .net foreach null

如何避免foreach语句中的条件,但同时省略了可能的null元素的处理?

public class MyObject
{
    public int Value = 0;

    public MyObject(int value) : base()
    {
        Value = value;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var list = new List<MyObject>()
        {
            new MyObject(1),
            new MyObject(2),
            null,
            new MyObject(4),
            new MyObject(5)
        };

        foreach (MyObject obj in list)
        {
            if (obj != null)
            {
                Console.WriteLine(obj.Value);
            }
        }

        list.ForEach(obj =>
        {
            if (obj != null)
            {
                Console.WriteLine(obj.Value);
            }
        });
    }
}

6 个答案:

答案 0 :(得分:8)

您可以使用OfType方法

foreach (MyObject obj in list.OfType<MyObject>())

答案 1 :(得分:3)

如果需要检查null,则无法避免空检查。但是你可以从foreach body中删除null check:

foreach (MyObject obj in list.Where(o => o != null))
    Console.WriteLine(obj.Value);

答案 2 :(得分:2)

通过控制列表中的内容。如果您不允许添加空值,则无需担心。

答案 3 :(得分:1)

list.Where(x=>x!=null).ForEach(x=>Console.WriteLine(x.Value));

答案 4 :(得分:1)

这里:没有“检查”null,但是你不处理空对象。

foreach (var obj in list)
{
    try
    {
        // obj.GetType(); -- if you want to FORCE an NRE, you could do this to avoid any side effects of the next line
        doThingWithObj(obj);
    }
    catch (NullReferenceException)
    {
        // look ma, no null check!
    }
}

编辑:我从未说过这是问题的解决方案。我只声明它确实完全 OP想要的东西。坦率地说,这对我来说是一个可怕的想法,但OP还没有解释为什么他们想要他们想要的东西。在真正古老的Java性能方面,java设置异常意味着省略空检查和捕获空指针异常的方式可能非常更高效,如果空值非常罕见(iirc,&lt ; 1:1000)。但除此之外,我认为这是一个非常糟糕的主意。

答案 5 :(得分:0)

可能的另一个不太好的想法是:

使用struct代替class?那么你保证是非空的,永远不需要空检查。