2016-01-20 2 views
0

ЭтоНачинающий C# Linq: перекручивание через KVP в словаре <>

foreach (KeyValuePair<string, int> kvp in myDic.Select(x => x).ToList()) 
    { 

    } 

и это

foreach (KeyValuePair<string, int> kvp in myDic.ToList()) 
    { 

    } 

то же самое?

Я видел этот код и был смущен. Имеет ли «Выберите (х => х) часть только там для удобства, чтобы потом его можно превратить в нечто вроде (х => х! = 0)?

+0

На каком языке это? Измените вопрос, чтобы добавить язык в качестве тега. –

ответ

1

Select(x => x) на самом деле не имеет значения. Однако, ToList() создает новый список из коллекции. Это отличается от ответа @NikolaiDante в случаях, когда myDic изменен внутри цикла.

Пример:

// working fine 
foreach (KeyValuePair<string, int> kvp in myDic.ToList()) 
{ 
    if (kvp.Value == 0) myDic.Remove(kvp.Key); 
} 

// throwing exception on Remove 
foreach (KeyValuePair<string, int> kvp in myDic) 
{ 
    if (kvp.Value == 0) myDic.Remove(kvp.Key); 
} 
1

Да. Вот runnable fiddle.

Кроме того,

foreach (KeyValuePair<string, int> kvp in myDic) 
{ 

} 

будет работать тоже, как вам не нужно .ToList(), чтобы itterate над словарем.

1

Да, они точно так же в результатах, которые они производят

Но, вы можете просто использовать:

foreach (var item in myDic) 
{ 

} 

потому, что словарь реализует IEnumerable и, следовательно, вы можете перебрать него

2 способами вы написали только добавляет ненужную работу конвертирование словаря в другую коллекцию

1

Они точно так же, потому что

Select.(x => x) 

будет просто вернуть первоначальный список.

Представьте, что x был экземпляром Client, и вы бы писали код доставки и требовали только адреса клиентов.

Тогда вы бы с

Select.(x => x.Address) 

, который будет возвращать List<Address> вместо List<Client> поэтому развязки вашего метода из Client класса (почему бы судоходства заботиться о самом клиенте, это нужно только адрес)