2

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

声明如下:

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

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

clients["key"] = myCustomClassObject1;

现在我怎样才能myCustomClassObject1从我的字典中找到并删除这个项目。我只想使用值项而不是键

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

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

4

5 回答 5

6

这取决于您需要它如何执行。如果您可以接受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);
}
于 2013-09-20T09:04:38.480 回答
4

按字典的值搜索字典的效率不是很高。但是,您可以使用 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);
于 2013-09-20T09:04:55.243 回答
1

如果集合仅包含一个具有要删除的值的项目,那么您可以在此处使用其他答案之一,这样就可以了。

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

您不能在迭代集合时修改它,因此您需要在一个循环中找到要删除的所有项目的键并将它们放在一个列表中,然后在一个单独的循环中迭代该列表以删除项目。

例如:

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();
        }
    }
}
于 2013-09-20T09:15:55.687 回答
1

这应该这样做。它删除所有具有给定值的客户端。

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);
于 2013-09-20T09:03:44.393 回答
1

使用, Following 将只删除第一个匹配值

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);
}
于 2013-09-20T09:04:59.947 回答