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ますが、通常、このパターンは、これが使用する 2 つのルックアップ操作 (最初に試行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、2 番目のレベルで使用します。

var result = new List<string>();
foreach(var inner in tasks.Values)
{
    string tmp;
    if(inner.TryGetValue(yourKey, out tmp)
        result.Add(tmp);
}

このソリューションには、これまでに提示された他のすべてのソリューションよりも大きな利点があります。実際には、2 番目の階層レベルの辞書を辞書として使用します。つまり、foreach ループ内の部分は、他のすべての場合と同様に O(n) ではなく O(1) です。ソリューション。

于 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

ダニエルのソリューションは、理解しやすいため、おそらく最適です。ただし、TryGetValue を linq アプローチで使用することもできます。

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>>();
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 に答える
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 に答える