C# 基于值删除字典中的项

C# 基于值删除字典中的项,c#,.net,linq,dictionary,C#,.net,Linq,Dictionary,我有一本字典 我需要查看字典,看看是否存在基于其他地方输入的值,如果存在,请删除它 ContainsValue只表示true/false,而不是该项的索引或键 救命啊 谢谢 编辑:刚找到这个-你怎么看 var key = (from k in dic where string.Compare(k.Value, "two", true) == 0 select k.Key).FirstOrDefault(); 编辑2:我也刚刚完成了这个,可能会有用 foreach (KeyValuePair&l

我有一本
字典

我需要查看字典,看看是否存在基于其他地方输入的值,如果存在,请删除它

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);
}
foreach(myDic中的KeyValuePair kvp)
{
if(myList.Any(x=>x.Id==kvp.Value))
myDic.Remove(kvp.Key);
}

在字典中循环查找索引,然后将其删除。

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

如果试图删除单个值,如何定义要删除的值

在查询值时无法获取键的原因是,字典可能包含多个与指定值成对的键

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

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()
将值复制到新集合。如果未进行调用,则循环将修改它正在迭代的集合,从而导致在删除第一个值后下次尝试迭代时引发异常。

Dictionary source
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);
}
// //函数式编程-不修改状态-仅创建新状态 字典结果=源 .Where(kvp=>string.Compare(kvp.Value,“two”,true)!=0) .ToDictionary(kvp=>kvp.Key,kvp=>kvp.Value) // //或者您可以修改状态 列表键=源 .Where(kvp=>string.Compare(kvp.Value,“two”,true)==0) .Select(kvp=>kvp.Key) .ToList(); foreach(将键串入键中) { source.Remove(按键); }
在我的例子中,我使用这个

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

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

    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);
    }
publicstaticvoidremoveallbyvalue(这个字典,V值)
{
foreach(字典中的var键。在哪里(
kvp=>EqualityComparer.Default.Equals(kvp.Value,Value))。
选择(x=>x.Key).ToArray()
删除(键);
}

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

 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);
        }
    }
publicstaticvoidremovebyvalue(此字典src,T1值)
{
foreach(src.Where(kvp=>kvp.Value.Equals(Value)).ToList()中的变量项)
{
src.Remove(项.键);
}
}

我想你需要一本字典。检查此问题:@Edit 2:您要在枚举集合时从集合中删除内容吗?“这不是一个例外吗?@JustLoren-说得好!将枚举列表并运行LINQ以查找密钥(如果它存在),然后只需从我的字典中调用remove,而无需concern@Jon,foreach也可以,只要在找到并删除密钥后添加一个中断。第一个代码示例不起作用,因为不允许修改foreach循环中的集合。匿名编辑删除了一些必要的代码。在第二种情况下,使用以下查询可以获得更好的性能:
foreach(dic.Where中的var项(kvp=>kvp.Value==Value)。Take(1.ToList())
,这也使得
中断
变得不必要。这
ToList
技巧很聪明……它会让我从我写过的几乎每一个
循环中解脱出来。正如公认的答案中所指出的,如果在循环浏览字典时删除了字典项,则如果在删除的字典项之后仍有值,则会抛出错误。