假设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
}
}
答案 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();
如果引发了异常,执行流程将不会到达循环。