检查字典中是否存在某个项,并将其从 C# 中的字典中删除

本文关键字:字典 删除 存在 是否 检查 | 更新日期: 2023-09-27 18:32:16

这个问题应该从标题本身就很清楚。我需要检查字典中是否存在项目并将其从 C# 中的字典中删除。唯一的问题是我必须仅使用值项而不是键来执行此操作。

声明如下:

IDictionary<string, myCustomClassObject> clients = new IDictionary<string, myCustomClassObject>();

现在我通过以下方式填写字典:

clients["key"] = myCustomClassObject1;

现在,我如何从字典中找到并删除myCustomClassObject1的此项目。我只想使用值项而不是键

这是哆哆嗦...如果是这样,请指导...问候

编辑:谢谢大家。有宝贵的意见...可能有一些想法要做...谢谢

检查字典中是否存在某个项,并将其从 C# 中的字典中删除

这取决于您需要它如何执行。如果你能接受O(N)的表现,你可以做这样的事情:

foreach(var pair in clients) {
    if(pair.Value == expected) {
        clients.Remove(pair.Key);
        break;
    }
}

但是,如果您需要更快的词典,则需要两个字典 - 一个与另一个相反(即由实例键控)。因此,在添加时,您将执行以下操作:

clientsByKey.Add(key, value);
clientsByValue.Add(value, key);

所以你可以做(按值删除):

string key;
if(clientsByValue.TryGetValue(value, out key)) {
    clientsByValue.Remove(value);
    clientsByKey.Remove(key);
}

或类似(按键删除):

Foo value;
if(clientsByKey.TryGetValue(key, out value)) {
    clientsByValue.Remove(value);
    clientsByKey.Remove(key);
}

按字典的值搜索字典不是很有效。但是,可以使用 Linq 查找具有给定值的所有条目。

IEnumerable<KeyValuePair<string, myCustomClassObject>> pairs = clients
    .Where(entry => entry.Value.Equals(myCustomClassObject1)).ToList();
foreach (KeyValuePair<string, myCustomClassObject> kv in pairs)
    clients.Remove(kv.Key);

这应该可以做到。它会删除具有给定值的所有客户端。

while (clients.ContainsValue(myCustomClassObject1))
    clients.Remove(clients.Where(x => x.Value == myCustomClassObject1).FirstOrDefault().Key);

或者创建一个没有要删除的值的新字典

clients = clients.Where(x => x.Value != myCustomClassObject1).ToDictionary(k => k.Key, v => v.Value);

如果集合只包含一个具有要删除的值的项目,那么您可以在此处使用其他答案之一,这将正常工作。

但是,如果您的集合可以有多个具有相同值的项目,那么您需要小心。

在循环访问集合时无法修改集合,因此需要在一次循环中找到要删除的所有项的键并将它们放在列表中,然后在单独的循环中循环访问该列表以删除这些项。

例如:

using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
    class Program
    {
        void run()
        {
            var dict = new Dictionary<string, int>
            {
                {"Key1", 1}, 
                {"Key2", 2}, 
                {"Key3", 3}, 
                {"Key4", 2}, 
                {"Key5", 4}
            };
            int valueToRemove = 2;
            var keysToRemove = (from element in dict
                                where element.Value == valueToRemove
                                select element.Key).ToList();
            foreach (var key in keysToRemove)
                dict.Remove(key);
            foreach (var element in dict)
                Console.WriteLine("Key = {0}, Value = {1}", element.Key, element.Value);
        }
        static void Main(string[] args)
        {
            new Program().run();
        }
    }
}

使用,以下将仅删除第一个匹配值

client newClient = new client();
foreach(KeyValuePair<string, client> client in clients) {
    if(client.value.equals(newClient)) {
        clients.remove(client.key);
        break;
    }       
}

或者,如果要删除所有匹配的值,

foreach(var client in clients.Where(kvp => kvp.Value == newClient).ToList()) {
    clients.Remove(client.Key);
}