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.

因此,因此,当我m.GetString(0)在此示例中执行此操作时,它会引发异常,msg[0]auint而不是 a string。这是我用来获取类型的,因为m不包含 GetType 并且我无法编辑 m。

Messagem 是我无法编辑的库中的类实例。

try-catch然而,尽管这工作得很好,但为了获取类型而故意创建异常(即使它在 a 中)感觉效率低下(当然也不利于读者) 。

有没有更好的方法或者我坚持这个?

编辑:好的,我对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根本没有任何类型。


[在我知道类型之前我之前的回答m]

我认为您可以采取以下三种方法之一:

(1) 将bool TryGetString(int index, out string)方法添加到示例中的任何类型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 回答