根据值删除字典中的项目

时间:2009-10-28 12:16:09

标签: c# .net linq dictionary

我有Dictionary<string, string>

我需要在该字典中查看是否存在基于来自其他地方的输入的值,如果存在则将其删除。

ContainsValue只是说真/假,而不是该项的索引或键。

帮助!

由于

编辑:刚发现这个 - 您怎么看?

var key = (from k in dic where string.Compare(k.Value, "two", true) ==
0 select k.Key).FirstOrDefault();

编辑2:我也只是把它搞砸了,这可能有用

foreach (KeyValuePair<string, string> kvp in myDic)
{
    if (myList.Any(x => x.Id == kvp.Value))
        myDic.Remove(kvp.Key);
}

6 个答案:

答案 0 :(得分:112)

您是要删除单个值还是所有匹配值?

如果您尝试删除单个值,如何定义要删除的值?

查询值时没有获得密钥的原因是因为字典可能包含与指定值配对的多个密钥。

如果要删除相同值的所有匹配实例,可以执行以下操作:

foreach(var item in dic.Where(kvp => kvp.Value == value).ToList())
{
    dic.Remove(item.Key);
}

如果你想删除第一个匹配的实例,你可以查询找到第一个项目,然后删除它:

var item = dic.First(kvp => kvp.Value == value);

dic.Remove(item.Key);

注意:需要ToList()调用才能将值复制到新集合中。如果没有进行调用,循环将修改它正在迭代的集合,导致在删除第一个值后下一次迭代尝试时抛出异常。

答案 1 :(得分:7)

Dictionary<string, string> source
//
//functional programming - do not modify state - only create new state
Dictionary<string, string> result = source
  .Where(kvp => string.Compare(kvp.Value, "two", true) != 0)
  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
//
// or you could modify state
List<string> keys = source
  .Where(kvp => string.Compare(kvp.Value, "two", true) == 0)
  .Select(kvp => kvp.Key)
  .ToList();

foreach(string theKey in keys)
{
  source.Remove(theKey);
}

答案 2 :(得分:2)

遍历字典以查找索引,然后将其删除。

答案 3 :(得分:1)

以下是您可以使用的方法:

    public static void RemoveAllByValue<K, V>(this Dictionary<K, V> dictionary, V value)
    {
        foreach (var key in dictionary.Where(
                kvp => EqualityComparer<V>.Default.Equals(kvp.Value, value)).
                Select(x => x.Key).ToArray())
            dictionary.Remove(key);
    }

答案 4 :(得分:0)

在我的情况下,我使用这个

  var key=dict.FirstOrDefault(m => m.Value == s).Key;
            dict.Remove(key);

答案 5 :(得分:-1)

您可以使用以下作为扩展方法

 public static void RemoveByValue<T,T1>(this Dictionary<T,T1> src , T1 Value)
    {
        foreach (var item in src.Where(kvp => kvp.Value.Equals( Value)).ToList())
        {
            src.Remove(item.Key);
        }
    }