我有一个字典,用于保存已解析的测试运行中的信息。键是方法的名称,值是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很陌生,我还在尝试了解如何访问这样的数据。
答案 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);