4

我有这个结构:

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){

}

我如何访问它?

4

7 回答 7

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();  
于 2011-09-20T14:13:12.377 回答
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) 与所有其他解决方案。

于 2011-09-20T14:10:19.293 回答
3

检查此功能:

   tasks.
      Where(task => task.Value.ContainsKey(8)).
      Select(task => task.Value[8]);
于 2011-09-20T14:12:59.473 回答
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();
于 2011-09-20T15:04:52.183 回答
1

你在构建任务吗?
如果我猜对了,那就是 tasks[task_id]([cpu] => "task_name");
我建议你也构建 cpu_tasks[cpu]([task_id] => "task_name);

static Dictionary<int, Dictionary<int, string>> cpu_tasks

它需要更多的维护,但会让你更快地运行这个特定的功能。

于 2011-09-20T14:15:39.990 回答
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]);
}
于 2011-09-20T14:10:35.750 回答
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);
于 2011-09-20T14:20:56.057 回答