我不是LINQ解决方案,
我使用简单的谓词来确定是否应该删除密钥,
例如,如果字典的构造类似于Dictionary<int, int>
,
那么如何删除所有带有负数据的条目
我更喜欢使用相同的字典,而不是创建新的字典, 我没有表现问题
有没有办法,不使用LINQ,而是使用Lambda表达式?
我不想在LINQ中使用解决方案,因为没有人在我的项目中使用它们,不想成为第一个..但是因为我看到LINQ解决方案看起来更好,我将使用它们.. < / p>
答案 0 :(得分:66)
最简单的方法可能是创建一个 new 字典,如果可以的话:
var newDictionary = oldDictionary.Where(pair => pair.Value >= 0)
.ToDictionary(pair => pair.Key,
pair => pair.Value);
如果你有来改变现有字典(例如因为其他几个对象都引用了同一个字典),你需要构建一个要删除的键列表,然后删除它们:< / p>
var toRemove = dictionary.Where(pair => pair.Value < 0)
.Select(pair => pair.Key)
.ToList();
foreach (var key in toRemove)
{
dictionary.Remove(key);
}
编辑:我刚刚注意到第一句话:“我不是在进入LINQ解决方案”。如果这意味着您不想使用 LINQ解决方案,那么这是手版:
List<int> toRemove = new List<int>();
foreach (KeyValuePair<int, int> pair in dictionary)
{
if (pair.Value < 0)
{
toRemove.Add(pair.Key);
}
}
foreach (var key in toRemove)
{
dictionary.Remove(key);
}
...但如果您可以使用LINQ,我会鼓励您这样做。我的第二个解决方案相当于“副手”版本,但更具可读性IMO。
答案 1 :(得分:8)
仅使用lambda表达式:
foreach (var i in myDict.Where(d => (d.Value < 0 || d.key <0)).ToList() )
{
myDict.Remove(i.Key);
}
答案 2 :(得分:2)
var toRemove = dict.Keys.Where(predicate).ToArray();
foreach (var key in toRemove) {
dict.Remove(key);
}
答案 3 :(得分:1)
好吧,如果你添加
namespace MMExtensions
{
public static class DictionaryExtensions
{
public delegate bool Predicate<TKey, TValue>(KeyValuePair<TKey, TValue> d);
[MethodImpl(MethodImplOptions.Synchronized)]
public static void Filter<TKey, TValue>(
this Dictionary<TKey, TValue> hashtable, Predicate<TKey, TValue> p)
{
foreach (KeyValuePair<TKey, TValue> value in hashtable.ToList().Where(value => !p(value)))
hashtable.Remove(value.Key);
}
}
}
你有一些数据集作为字典:
Dictionary<string, int> d =
new Dictionary<string, int> {{"v", -3}, {"val1", 1}, {"val2", 2}};
然后你可以使用:
d.Filter(delegate(KeyValuePair<string, int> kv) { return kv.Value >= 0; });
d.Filter(kv => kv.Value >= 0);// or as lambda
答案 4 :(得分:0)
是否要删除该词典中的项目,或者您是否乐意使用未包含这些项目的新词典?
var d = new Dictionary<int,int>();
var newDict = d.Where(entry => entry.Value >= 0).ToDictionary(entry => entry.Key, entry => entry.Value);
答案 5 :(得分:0)
最简单的一个:
Dictionary<long, long> dict...
Dictionary<long, long> result = dict.Were(x => x.Value >= 0).ToDictionary(x => x.Key, x => x.Value);
或者只是以相反的顺序遍历'for'中的所有内容并删除无效的内容。
答案 6 :(得分:0)
我知道您说过您不喜欢Linq,但我无法提供以下解决方案,如果您阅读问题的标题,它仍然很有用。这可能是解决问题的最优雅的方法:
dictionary.Where(pair => pair.Value < 0)
.Select(pair => {
dictionary.Remove(pair.Key);
return pair.Key;
});