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

Если одна из строк не длинна 10 символов, я получаю исключение ArgumentOutOfRangeException.LINQ Iterator Обработка исключений

В этом случае ее достаточно тривиально, чтобы выяснить, и я знаю, что могу сделать

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

С более сложных ошибок строительных объектов, как это не всегда легко понять, хотя. Есть ли способ увидеть, какая строка не была достаточной для обработки исключений?

ответ

2

Создайте метод, который выполняет сложное преобразование, которое может генерировать исключения и вызывать его из лямбда. например .Select (s => complexMethod (s))

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

Теперь вы можете войти исключение внутри блока улова перед повторным метанием, или использовать Exception.Data добавить информацию к нему перед повторным метанием, или обертка это в обычном исключении с необходимой информацией. Не забудьте использовать «бросок», когда вы повторно бросаете его, если это не обычное исключение.

Вы также можете поместить встроенный метод тела в лямбда: .Select(s => { ... return ...})

+0

Я просто использовал метод синтаксис блоков на что-то еще вчера и даже не сделать соединение. Благодаря! – kwcto

0

До тех пор, пока вы не собираетесь использовать его с LinqToSQL или EF, вы можете создать свой собственный метод расширения, который обертывает исключение и сообщает вам значение строки.

0

В этом случае, где положение может быть целесообразным, чтобы отфильтровать длину вы ищете:

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

EDIT
Просто перечитайте вопрос понял, что OP ищет для обработки исключений чтобы увидеть, какие строки были недостаточно длинными. Предполагая, что вам все равно, какие строки достаточно длинные, тогда предоставленное решение будет работать.

Смежные вопросы