我有这个结构:
static Dictionary<int, Dictionary<int, string>> tasks =
new Dictionary<int, Dictionary<int, string>>();
看起来像那样
[1]([8] => "str1")
[3]([8] => "str2")
[2]([6] => "str3")
[5]([6] => "str4")
我想从此列表中获取所有[8]
个字符串,这意味着str1
+ str2
该方法应如下所示:
static List<string> getTasksByNum(int num){
}
如何访问它?
答案 0 :(得分:5)
使用LINQ,您可以执行以下操作:
return tasks.Values
.Where(dict => dict.ContainsKey(8))
.Select(dict => dict[8])
.ToList();
虽然这很优雅,但TryGetValue
模式通常优于它使用的两个查找操作(首先尝试ContainsKey
然后使用索引器获取值)。
如果这对你来说是一个问题,你可以做一些事情(使用合适的辅助方法):
return tasks.Values
.Select(dict => dict.TryGetValueToTuple(8))
.Where(tuple => tuple.Item1)
.Select(tuple => tuple.Item2)
.ToList();
答案 1 :(得分:4)
只需迭代第一层次结构的所有值,然后在第二层使用TryGetValue
:
var result = new List<string>();
foreach(var inner in tasks.Values)
{
string tmp;
if(inner.TryGetValue(yourKey, out tmp)
result.Add(tmp);
}
与目前为止提供的所有其他解决方案相比,此解决方案具有以下优势: 它实际上使用第二层次级别的字典作为字典,即foreach循环内部的部分是O(1)而不是O(n),与所有其他解决方案一样。
答案 2 :(得分:3)
检查此功能:
tasks.
Where(task => task.Value.ContainsKey(8)).
Select(task => task.Value[8]);
答案 3 :(得分:2)
丹尼尔的解决方案可能是最好的,因为它更容易理解。但是也可以在linq方法中使用TryGetValue:
return tasks.Values
.Select(dictionary => {
string task;
var success = dictionary.TryGetValue(yourKey, out task);
return new { success, task };
})
.Where(t => t.success)
.Select(t => t.task)
.ToList();
答案 4 :(得分:1)
你在建造任务吗?
如果我猜对了它的任务[task_id]([cpu] =&gt;“task_name”);
我建议你也建立cpu_tasks [cpu]([task_id] =&gt;“task_name);
static Dictionary<int, Dictionary<int, string>> cpu_tasks
这需要更多维护,但可以让您更快地运行此特定功能。
答案 5 :(得分:0)
Dictionary<int, Dictionary<int, string>> tasks = new Dictionary<int, Dictionary<int, string>>();
List<string> strings = new List<string>();
foreach(var dict in tasks.Values)
{
if(dict.ContainsKey(8))
strings.Add(dict[8]);
}
答案 6 :(得分:0)
Dictionary<int, Dictionary<int, string>> tasks = new Dictionary<int, Dictionary<int, string>>();
var result = string.Empty;
//more human-readable version
var searchValue = 8;
foreach (var task in tasks)
{
if (task.Value.ContainsKey(searchValue))
result += task.Value[searchValue];
}
//one-line version
result = tasks.ToList().Aggregate(string.Empty, (a, kvp) => a += kvp.Value.ContainsKey(searchValue) ? kvp.Value[searchValue] : string.Empty);