根据值删除字典中的项目

Jon*_*Jon 53 .net c# linq dictionary

我有一个Dictionary<string, string>.

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

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

救命!

谢谢

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

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

编辑2:我也只是敲了这个可能有效

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

Pau*_*ner 118

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

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

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

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

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

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

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

dic.Remove(item.Key);
Run Code Online (Sandbox Code Playgroud)

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

  • 第一个代码示例不起作用,因为它不允许在foreach循环中修改集合. (9认同)
  • 在第二种情况下,使用此查询可以获得更好的性能:`foreach(在dic.Where中的var项(kvp => kvp.Value == value).Take(1).ToList())`这也是使'break`不必要. (3认同)
  • `ToList` 技巧很聪明……它可以使我免于我写过的几乎所有 `for` 循环。 (2认同)

Amy*_*y B 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);
}
Run Code Online (Sandbox Code Playgroud)