删除基于值的字典中的项目
我有一个Dictionary<string, string>
。
我需要查看该字典,以查看是否存在基于来自其他地方的input的值,如果存在,则将其删除。
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); }
你想删除一个值或所有匹配的值?
如果您试图删除单个值,那么您如何定义您希望删除的值?
查询值时没有得到关键字的原因是因为字典可能包含与指定值配对的多个键。
如果你想删除所有匹配的相同值的实例,你可以这样做:
foreach(var item in dic.Where(kvp => kvp.Value == value).ToList()) { dic.Remove(item.Key); }
如果你想删除第一个匹配的实例,你可以查询find第一个项目,只是删除:
var item = dic.First(kvp => kvp.Value == value); dic.Remove(item.Key);
注意: ToList()
调用是将值复制到新集合所必需的。 如果没有调用,则循环将修改它正在迭代的集合,导致在第一个值被删除后下一次迭代尝试时抛出exception。
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); }
通过词典循环find索引,然后将其删除。
以下是您可以使用的一种方法:
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); }
在我的情况下,我用这个
var key=dict.FirstOrDefault(m => m.Value == s).Key; dict.Remove(key);