2010-03-10 65 views
5
var trimmed = myStringArray.Select(s => s.Substring(0, 10)); 

如果其中一个字符串不是10个字符长,我会得到一个ArgumentOutOfRangeException。LINQ迭代器异常处理

在这种情况下,它相当琐碎找到了,我知道我可以做

s.Substring(0, Math.Min(10, s.Length)) 

有了这样更复杂的对象结构错误并不总是很容易看到,虽然。有没有办法通过异常处理来查看哪些字符串不够长?

回答

2

创建一个方法,执行可以抛出异常并从lambda调用它的复杂转换。例如。选择(S => complexMethod(S))

string complexMethod(string s) 
{ 
    try 
    { 
    ... 
    return ... 
    } 
    catch 
    ... 
} 

现在,您可以登录catch块中的例外再扔之前,或使用Exception.Data重新投掷前,将信息添加到它,或包装材料它在一个自定义例外与你需要的信息。如果它不是自定义的异常,请记住在重新抛出时只使用'throw'。

你也可以把方法体内嵌在lambda:.Select(s => { ... return ...})

+0

我只是用的东西方法块语法昨天别的,甚至没有进行连接。谢谢! – kwcto 2010-03-10 20:15:55

0

只要您不打算将它与LinqToSQL或EF一起使用,您可以创建自己的扩展方法来封装异常并告诉您字符串的值。

0

在这种情况下Where子句可适当筛选出你要找的长度:

var trimmed = myStringArray 
     .Where(s => s.Length >= 10) 
     .Select(s => s.Substring(0, 10)); 

编辑
只是重新阅读问题实现了OP是寻找异常处理看看哪些字符串不够长。假设你不在乎什么字符串足够长,那么提供的解决方案将工作。