使用Linq从Dictionary C#中删除特定值

时间:2016-10-07 10:19:24

标签: c# linq dictionary lambda

我有一个字典,用于保存已解析的测试运行中的信息。键是方法的名称,值是TestRunProperties的列表。我的字典包含测试运行中的所有方法,我想删除测试运行期间失败的方法。这可能与Linq有关吗?

TestRunProperties类:

public class TestRunProperties
{
    public string computerName { get; set; }
    public TimeSpan duration { get; set; }
    public string startTime { get; set; }
    public string endTime { get; set; }
    public string testName { get; set; }
    public string outcome { get; set; }
}

字典:

//Key is the name of the method, value is the properties associated with each run
private static Dictionary<string, List<TestRunProperties>> runResults = new Dictionary<string, List<TestRunProperties>>();

我已经尝试过了,但我认为我对Where部分感到困惑:

runResults.Remove(runResults.Where(methodName => methodName.Value.Where(method => method.outcome.ToLower().Equals("failed"))));

我对Linq和Lambda很陌生,我还在尝试了解如何访问这样的数据。

3 个答案:

答案 0 :(得分:3)

只需使用循环即可删除您不想要的内容。您可以编写一个扩展方法,以便更容易调用:

public static class DictionaryExt
{
    public static void RemoveAll<K, V>(this IDictionary<K, V> dict, Func<K, V, bool> predicate)
    {
        foreach (var key in dict.Keys.ToArray().Where(key => predicate(key, dict[key])))
            dict.Remove(key);
    }
}

这通常比创建一个全新的字典更有效,特别是如果删除的项目数量与字典大小相比相对较低。

您的主叫代码如下所示:

runResults.RemoveAll((key, methodName) => methodName.Value.Where(method => method.outcome.ToLower().Equals("failed")));

(我选择名称RemoveAll()来匹配List.RemoveAll()。)

答案 1 :(得分:1)

您可以通过过滤掉无效词典来创建新词典:

var filtered = runResults.ToDictionary(p => p.Key, p => p.Value.Where(m => m.outcome.ToLower() != "failed").ToList());

好的,grrrrrr更快: - )

答案 2 :(得分:0)

说实话,你最好从现有词典中选择一个新词典:

runResults.Select().ToDictionary(x => x.Key, x => x.Value.Where(x => x.Value.outcome != "failed"));

*编辑以反映字典中的列表。

实际上,你也可以通过这样做摆脱没有成功结果的那些:

runResults.Select(x => new { x.Key, x.Value.Where(x => x.Value.outcome != "failed")} ).Where(x => x.Value.Any()).ToDictionary(x => x.Key, x => x.Value);