当ienumerable为空时,“Else”等效于foreach循环

时间:2013-03-20 14:50:10

标签: c# collections foreach ienumerable

假设ienumerable不为null,如果该ienumerable为空,则foreach循环将不会执行。但相反,如果集合为空,我需要运行其他代码。这是完美无缺的示例代码:

List<string> theList = new List<string>() {};

if (theList.Count > 0) {
    foreach (var item in theList) {
       //do stuff
    }
} else {
    //throw exception or do whatever else
}

无论如何通过开箱即用的C#,扩展方法等来缩短它?在我的脑海中,我认为以下会很酷,但显然它不起作用:

List<string> theList = new List<string>() {};

foreach (var item in theList) {
   //do stuff
} else {
    //throw exception or do whatever else
}
编辑:我的解决方案归功于Maarten的见解:如果集合为null或为空(如果您只想忽略集合为null或为空的情况,则以下将抛出异常,请使用在foreach中的三元运算符)

static class Extension {
    public static IEnumerable<T> FailIfNullOrEmpty<T>(this IEnumerable<T> collection) {
        if (collection == null || !collection.Any())
            throw new Exception("Collection is null or empty");

        return collection;
    }
}

class Program {
    List<string> theList = new List<string>() { "a" };

    foreach (var item in theList.FailIfNullOrEmpty()) {
        //do stuff                    
    }
}

2 个答案:

答案 0 :(得分:0)

如果你真的想要实现这一点,你可以创建一个扩展方法(就像你自己说的那样)。

class Program {
    static void Main(string[] args) {
        List<string> data = new List<string>();
        foreach (var item in data.FailIfEmpty(new Exception("List is empty"))) {
            // do stuff
        }
    }
}
public static class Extensions {
    public static IEnumerable<T> FailIfEmpty<T>(this IEnumerable<T> collection, Exception exception) {
        if (!collection.Any()) {
            throw exception;
        }
        return collection;
    }
}

答案 1 :(得分:0)

您可以预先抛出异常,而无需编写else块:

if(mylist.Count == 0)
    throw new Exception("Test");

foreach(var currItem in mylist)
    currItem.DoStuff();

如果引发了异常,执行流程将不会到达循环。