Используя C # 7 , добавьте метод расширения к любому проекту вашего решения:
public static class IDictionaryExtensions
{
public static IEnumerable<(TKey, TValue)> Tuples<TKey, TValue>(
this IDictionary<TKey, TValue> dict)
{
foreach (KeyValuePair<TKey, TValue> kvp in dict)
yield return (kvp.Key, kvp.Value);
}
}
И используйте этот простой синтаксис
foreach (var(id, value) in dict.Tuples())
{
// your code using 'id' and 'value'
}
Или этот, если вы предпочитаете
foreach ((string id, object value) in dict.Tuples())
{
// your code using 'id' and 'value'
}
На месте традиционного
foreach (KeyValuePair<string, object> kvp in dict)
{
string id = kvp.Key;
object value = kvp.Value;
// your code using 'id' and 'value'
}
Метод расширения преобразует KeyValuePair
вашего IDictionary<TKey, TValue>
в строго типизированный tuple
, что позволяет вам использовать этот новый удобный синтаксис.
Он преобразует -just- необходимые словарные записи в tuples
, поэтому он НЕ преобразует весь словарь в tuples
, поэтому никаких проблем с производительностью, связанных с этим.
Существует только незначительная стоимость вызова метода расширения для создания tuple
по сравнению с использованием KeyValuePair
напрямую, что НЕ должно быть проблемой, если вы присваиваете KeyValuePair
свойства Key
и Value
к новым переменным цикла в любом случае.
На практике этот новый синтаксис очень хорошо подходит для большинства случаев, за исключением сценариев сверхвысокой производительности низкого уровня, где у вас все еще есть возможность просто не использовать его в этом конкретном месте.
Проверьте это: Блог MSDN - Новые функции в C # 7