根据值删除字典中的项目

问题描述 投票:49回答:6

我有一个Dictionary<string, string>

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

ContainsValue只是说true / false而不是该项的索引或键。

救命!

谢谢

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

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);
}
c# .net linq dictionary
6个回答
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()调用是将值复制到新集合所必需的。如果没有进行调用,循环将修改它正在迭代的集合,导致在删除第一个值后下一次迭代尝试时抛出异常。


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
投票

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


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);
    }

0
投票

就我而言,我使用它

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

-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);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.