C# 如何使用LINQ“删减”词典?
我有一本字典和一系列要从字典中删除的键。这是我现在的实现:C# 如何使用LINQ“删减”词典?,c#,linq,C#,Linq,我有一本字典和一系列要从字典中删除的键。这是我现在的实现: var keys = (from entry in etimes where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime) select entry.Key).ToList(); foreach (var key in keys) { etimes.Remove(key); count--; } 我能做
var keys = (from entry in etimes
where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime)
select entry.Key).ToList();
foreach (var key in keys)
{
etimes.Remove(key);
count--;
}
我能做些什么来消除foreach循环吗
var pruned = etimes.Where(entry => Convert.ToInt64(entry.Value) >=
Convert.ToInt64(stime)).ToDictionary(entry => entry.Key,
entry => entry.Value);
此语句只是使用LINQ Where函数过滤字典,以选择要保留的项,而不是要删除的项,然后需要进一步的代码,如您所示。ToDictionary将IEnumerable转换为Desired Dictionary类型,并且至少相当简单,如果由于需要指定两个lambda表达式来从KeyValuePair中选择键和值,然后创建一个新字典,那么它不是非常优雅或高效。说到这里,我并不认为这是一个问题,尤其是当字典很小和/或删除的项目数量很大时。好吧,撇开性能或可读性问题不谈,这难道不能像下面这样做吗:
<Extension> void itemDelete(List l, object item) {
l.Remove(item)
}
var keys = (from entry in etimes
where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime)
select entry.Key).ToList();
keys.foreach(itemDelete());
请原谅我的编码,我不是100%确定确切的语法,尤其是在C语言中;考虑一下伪代码。
注意在LINQ查询的末尾添加了新函数和.foreach函数。
我知道这在VB中是可能的,我假设C有类似的东西。。。如果没有,您可以编写自己的.foreach扩展。
它可能会或不会改善任何东西,但这是一个想法 顺便说一句,我不想对性能发表评论-如果您关心这一点,那么请测试这两种方法。我不确定使用foreach的原始解决方案是否会快得多。我不担心性能,字典中随时都只有几个键。我只是想更好地了解LINQ。谢谢,这很有效。这可能比简单的for each循环要昂贵得多,因为它将创建一个新的字典。我认为它也不能提高可读性。所以我会坚持使用for-each循环,并可能将其移动到一个扩展方法,但我认为LINQ解决方案根本不会获胜。@Daniel:这可能是真的,但如果要删除的项目数量相对较大或字典相对较小,那么我怀疑速度上的差异是否太大@scotty2012:很高兴它能为您工作。@Daniel:这可能是真的,但在我的示例中,我正在创建一个附加列表并运行foreach循环。顺便说一句,您不需要。ToList foreach可以与任何IEnumerableInq一起工作。Inq是一种查询语言,它可以通过转换现有数据来创建新数据。它无法更改现有数据。如果这是一个愚蠢的问题,请原谅,但您是否会在分部类中创建此扩展方法?我仍在努力掌握扩展方法,以及如何使用和创建它们。@Jagd:这不是使用分部类的任何理由。推荐的做法是在一个静态类中单独声明它们,并将扩展方法分组到具有类似功能的静态类中。。。我想说听听诺多林的最佳实践。