1

次のように書くための、より審美的で読みやすい方法があるかどうか疑問に思っていました。

for (int i = 0; i < 100; i++)
{ 
    // If m.GetString(i) throws an exception, continue.
    // Otherwise, do stuff.       
    try
    {
        string s = m.GetString(i);
        continue;
    }           
    catch (InvalidCastException) 
    { 
    }

    // do stuff with the message that you know is not a string.
}

m は次のようになります。

msg[0] = 10
msg[1] = "string"
msg[2] = 2.224574743
// Etc.
// Assume it's different every time.

したがって、この例で行うと、 aではなく a であるm.GetString(0)ため、例外がスローされます。GetType が含まれておらず、m を編集できないため、これを使用して型を取得します。msg[0]uintstringm

m は、Message編集できないライブラリ内のクラスのインスタンスです。

ただし、これがうまく機能しているにもかかわらず、型を取得するために、たとえそれが a であっても、意図的に例外を作成するのは非効率的です (そして確かに読みやすくはありません) try-catch

より良い方法はありますか、それとも私はこれにこだわっていますか?

編集:Messageわかりました、私はクラスをもう少し調査しました(最初に行うべきでした、申し訳ありません)。それはIEnumerable<object>

4

2 に答える 2

5

mこれが であることがわかったのでIEnumerable<object>、おそらくこれが最善の策だと思います。

foreach (string s in m.OfType<string>())
{
    // Process s, which can't be null.
}

素晴らしくシンプルで、必要なすべてのロジックを処理しているように見えます。つまり、シーケンス内の文字列であるアイテムのみを処理し、他のタイプのすべてのオブジェクトを無視します。

ただし、Servy が指摘してnullいるように、タイプがまったくないため、これはリスト内の null を処理しません。


[の型を知る前の私の以前の回答m]

これには、次の 3 つの方法のいずれかを使用できると思います。

bool TryGetString(int index, out string)(1)例にあるタイプにメソッドを追加してmから実行します

if (m.TryGetString(i, out s)) 
    // Process s (need to check for null!) 

(2) メソッドを追加し、bool IsString(int index)を呼び出す前にそれを呼び出しGetString()ます。

if (m.IsString(i)) 
{
    s = m.GetString(i); 
    // Process s (need to check for null!) 

(3) または、次のような方法でアイテムを公開してから、GetObject(int index)Iiya が提案したようなことを行うこともできます。

 string s = m.GetObject(i) as string; 

 if (s != null) 
     // Process s 

(1) または (3) が最適だと思いますが、より多くの情報があれば、より良い解決策を提案できるかもしれませんm

于 2013-05-29T15:08:07.387 に答える
2

厳密に型指定されていないデータ シーケンス内の文字列のみを処理する場合は、次のコードを使用します。

for (int i = 0; i < 100; i++)
{ 
    string s = m[i] as string;

    if(s != null)
    {

    }
}
于 2013-05-29T15:01:42.760 に答える