Допустим, у меня есть этот код:Во время отладки, могу ли я просматривать объект, вызывающий исключение в LINQ?
IDictionary<int, int> itemPriceDict = loadItemPriceDictionary();
IList<IRow> dbItems = loadItemsFromDatabase();
IList<ItemDTO> itemDTOs = dbItems
.Select(dbItem => new ItemDTO()
{
Id = dbItem.Id,
Label = dbItem.Label,
PriceTag = itemPriceDict[dbItem.Id] // Possible KeyNotFoundException
})
.ToList();
и иногда я получаю исключение KeyNotFound, когда данная цена тега не существует для данного dbItem.
Теперь при отладке в Visual Studio и исключение, вы можете увидеть StackTrace, TargetSite, которые показывают вам, что строка кода срабатывает, но это можно выяснить, какой объект (dbItem) вызвал исключение и отображать его данные в отладчике? Например, в окне просмотра?
Я хотел бы:
- Либо знать, какой ключ не присутствовал в словаре
- Или еще лучше знать ключ, а также на dbItem обработанную в Select
Но без необходимости добавлять или изменять какой-либо код.
P.S .: Я знаю, что могу переписать код как цикл, но я бы этого не хотел.
Это не сработает. Вы получили бы предложение KeyNotFoundException в Where, потому что словарь не возвращает null, если ключ отсутствует. –
ok попробуйте этот путь: Где (dbitem => dbitem.itemPriceDict [dbItem.Id] .Any()) – MKasprzyk
К сожалению, вы также получите исключение KeyNotFound. Это происходит в dbitem.itemPriceDict [dbItem.Id] перед вызовом Any(). Вы имеете в виду это: Where (dbItem => itemPriceDict.ContainsKey (dbItem.Id)) Но я не хочу изменять какой-либо код. Я бы посмотрел его в режиме отладчика - например, «Смотри окно». –