я принципиально хочу сделать это:Как получить IEnumerable <DictionaryEntry> из IDictionary?
if(obj is IDictionary)
{
return "{" + string.Join(Environment.NewLine, ((IDictionary)obj).Cast<DictionaryEntry>().Select(e => string.Format(" {0}: {1}", PrettyString(e.Key), PrettyString(e.Value)))) + "}";
}
Но я получаю неверный бросок. Я могу сделать
foreach(DictionaryEntry e in (IDictionary)obj)
Так почему я не могу это сделать?
Мне это очень интересно. Я написал расширение, чтобы решить эту проблему:
static class EnumerableExt
{
public static IEnumerable<DictionaryEntry> Entries(this IDictionary dict)
{
foreach (var item in dict) yield return (DictionaryEntry)item;
}
}
Тогда я могу просто сделать:
((IDictionary)obj).Entries().Select(...)
Любопытная часть что Resharper говорит мне, что я могу заменить мое расширение с этим:
return dict.Cast<DictionaryEntry>();
Но это исключает. Это ошибка в Resharper? Или как работает Cast
? Я бы предположил, что Cast
будет работать точно так же, как мое расширение.
Редактировать: Ah .. Я прочитал this answer немного ближе. Все еще странно.
Что такое 'obj' от вас код? Еще один контекст поможет. –
@ M.Babcock: Учитывая, что он находится внутри блока 'if (obj is IDictionary)', это гарантированно будет 'IDictionary'. Я тестирую 'Dictionary', если это имеет значение. Фактическим типом 'obj' является' object'. –
mpen
Только совет: вам гораздо лучше использовать общую версию с помощью KeyValuePair ' –
porges