-1

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                    
    }
}
4

2 に答える 2

0

elseブロックを記述しなくても、事前に例外をスローできます。

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

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

例外が発生した場合、実行フローはループに到達しません。

于 2013-03-20T14:55:55.753 に答える
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 に答える