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
技巧很聪明……它会让我从我写过的几乎每一个循环中解脱出来。正如公认的答案中所指出的,如果在循环浏览字典时删除了字典项,则如果在删除的字典项之后仍有值,则会抛出错误。