4

文字列を返す次の関数があります。

public static string GetFormattedErrorMessage(this Exception e)
{
    if (e == null)
    {
        throw new ArgumentNullException("e");
    }

    var exError = e.Message;
    if (e.InnerException != null)
    {
        exError += "<br>" + e.InnerException.Message;
        if (e.InnerException.InnerException != null)
        {
            exError += "<br>" + e.InnerException.InnerException.Message;
        }
    }

    return exError;
}

IEnumerable<string>誰かが助けて、この同じ関数が 1 つの要素だけを返すようにする方法を教えてもらえますか?

4

5 に答える 5

8
public static IEnumerable<string> GetFormattedErrorMessage(this Exception e)
        {
            if (e == null)
            {
                throw new ArgumentNullException("e");
            }

            var exError = e.Message;
            if (e.InnerException != null)
            {
                exError += "<br>" + e.InnerException.Message;
                if (e.InnerException.InnerException != null)
                {
                    exError += "<br>" + e.InnerException.InnerException.Message;
                }
            }

            yield return exError;
        }
于 2012-05-20T06:13:33.203 に答える
4

配列を返さないのはなぜですか? それは次のように簡単ですreturn new string[] { exError };

ハエを殺すために人々が大砲を使う理由は理解できませんが、ここでは本当に必要ありませんyield...

また、次の点にも注意してください。

  • yieldあなたが期待することをしないかもしれません

  • yield遅いです(それほどではありませんが、そこにあります)

于 2012-05-20T06:58:19.050 に答える
0

それを達成するには、yield return ステートメントを使用する必要があります。

public static IEnumerable<string> GetMessage(Exception e)
{
    yield return e.Message;
}
于 2012-05-20T06:14:46.380 に答える
0

IEnumerable に必要な要素が 1 つだけであることはわかりますが、IEnumerable が必要な理由はわかりません。

例外の各メッセージとその内部例外が必要な場合は、次のようにする必要があります。

public static IEnumerable<string> GetErrorMessages(this Exception e) 
{ 
    if (e == null) 
        throw new ArgumentNullException("e"); 

    yield return e.Message;

    Exception inner = e.InnerException;
    while(inner != null)
    {
        yield return inner.Message; 
        inner = inner.InnerException;
    }
}
于 2012-05-20T07:53:54.437 に答える
0

他の人が示したように使用することもできますyield returnが、舞台裏で何が起こっているのかを考えると、少しやり過ぎだと思います。

1 つの要素で を作成して、List<String>それを返してみませんか? それはIEnumerable<String>です。

于 2012-05-20T06:55:29.320 に答える