-1

假设 ienumerable 不为空,如果该 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 的见解,我的解决方案:如果集合为空或为空,以下将引发异常(如果您想简单地忽略集合为空或空的情况,请在 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                    
    }
}
4

2 回答 2

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;
    }
}
于 2013-03-20T14:55:24.007 回答
0

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

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

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

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

于 2013-03-20T14:55:55.753 回答