Самый эффективный способ удалить значение из серии списков в словаре?

У меня словарь настроен так:

private Dictionary<string, List<string>> Directory = new Dictionary<string, List<string>>();

Мне нужно перебрать каждый ключ в словаре и удалить все вхождения строки в каждом из списков.

Я полагаю, что могу сделать это с помощью ряда циклов for / for-each, возможно, создав новый список для каждого без строки, которую я пытаюсь удалить, но я чувствую, что это может стать неэффективным при увеличении размера словаря.

Есть ли методы, которые могут сделать это более эффективным?

Всего 4 ответа


Решение:

class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
        dictionary.Add("Test1", new List<string>() { "Test1", "Test2", "Test3" });
        dictionary.Add("Test2", new List<string>() { "Test2", "Test3", "Test1" });
        dictionary.Add("Test3", new List<string>() { "Test3", "Test2", "Test1" });
        dictionary.RemoveStringFromEveryList("Test1");
    }
}

public static class Extensions
{
    public static void RemoveStringFromEveryList(this Dictionary<string, List<string>> dictionary, string wordToRemove)
    {
        foreach(var keyValue in dictionary)
        {
            keyValue.Value.RemoveAll(x => x == wordToRemove);
        }
    }
}

Я бы использовал метод расширения для лучшего использования и читабельности вашего кода.


Я бы использовал традиционный цикл foreach

var strToRemove == "remove me!";
foreach (var listObj in dic.Values)
{
    listObj.RemoveAll(x => x.Equals(strToRemove ,StringComparison.OrdinalIgnoreCase));
}

Вы можете использовать RemoveAll() в цикле foreach, чтобы удалить все вхождения во всех списках указанной строки:

foreach (var val in Directory.Values)
{
    var numberOfElementsRemoved = val.RemoveAll(x => x.ToLower() == StringToRemove.ToLower());
}

Вы можете использовать оператор Where для поиска пары, у которой есть значение, которое нужно удалить ... затем обновите значение этой пары.

    Dictionary<string, List<string>> Directory = new Dictionary<string, List<string>>();
    Directory.Add("1", new List<string>() { "alpha", "bravo", "charlie" });
    Directory.Add("2", new List<string>() { "delta", "echo", "foxtrot" });
    Directory.Add("3", new List<string>() { "golf", "charlie", "India" });

    string stringToRemove = "charlie";
    Directory.Where(x => x.Value.Contains(stringToRemove))
                .ToList()
                .ForEach(x => x.Value.Remove(stringToRemove));

После выполнения «Чарли» исчез из всех пар словаря.

Согласно предложению Cid, вы также можете использовать RemoveAll(lambda) если у вас нет отдельного списка.

Directory.Where(x => x.Value.Contains(stringToRemove))
           .ToList()
           .ForEach(x => x.Value.RemoveAll(x => x.Equals(strToRemove ,StringComparison.OrdinalIgnoreCase)));

Есть идеи?

10000