Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ“删减”词典?_C#_Linq - Fatal编程技术网

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:这不是使用分部类的任何理由。推荐的做法是在一个静态类中单独声明它们,并将扩展方法分组到具有类似功能的静态类中。。。我想说听听诺多林的最佳实践。