Лучший способ удалить несколько объектов, соответствующих предикату из c# Словаря?

Это проще всего с библиотекой jQuery:

<input type="button" onClick="javascript:test_byid();" value="id='second'" />

<script>
function test_byid()
{
    $("#second").toggleClass("highlight");
}
</script>
51
задан Brann 22 January 2009 в 13:57
поделиться

5 ответов

Вот альтернативный путь

foreach ( var s in MyCollection.Where(kv => kv.Value.Member == foo).ToList() ) {
  MyCollection.Remove(s.Key);
}

, Продвижение кода в список непосредственно позволяет Вам избегать "удаления при перечислении" проблемы. Эти .ToList() вызовет перечисление, прежде чем foreach действительно запустится.

86
ответ дан n00bmind 7 November 2019 в 19:54
поделиться

можно создать дополнительный метод :

public static class DictionaryExtensions
{
    public static void RemoveAll<TKey, TValue>(this IDictionary<TKey, TValue> dict, 
        Func<TValue, bool> predicate)
    {
        var keys = dict.Keys.Where(k => predicate(dict[k])).ToList();
        foreach (var key in keys)
        {
            dict.Remove(key);
        }
    }
}

...

dictionary.RemoveAll(x => x.Member == foo);
21
ответ дан Community 7 November 2019 в 19:54
поделиться

Вместо удаления просто сделайте инверсию. Создайте новый словарь из старого, содержащего только элементы, которыми Вы интересуетесь.

public Dictionary<T, U> NewDictionaryFiltered<T, U>
(
  Dictionary<T, U> source,
  Func<T, U, bool> filter
)
{
return source
  .Where(x => filter(x.Key, x.Value))
  .ToDictionary(x => x.Key, x => x.Value);
}
11
ответ дан Amy B 7 November 2019 в 19:54
поделиться

Можно ли просто изменить цикл для использования индекса (т.е. ДЛЯ вместо FOREACH)? Необходимо было бы циклично выполниться назад, конечно, т.е. количество 1 вниз для обнуления.

0
ответ дан Geoff 7 November 2019 в 19:54
поделиться

Вместо того, чтобы удалить просто делают инверсию (создайте новый словарь из старого, содержащего только элементы, Вы интересуетесь), и позвольте сборщику "мусора" заботиться о старом словаре:

var newDictionary = oldDictionary.Where(x => x.Value != foo);
0
ответ дан Ian Kemp 7 November 2019 в 19:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: