【问题标题】:How to return tvalues from dictionary C#如何从字典 C# 返回 tvalues
【发布时间】:2020-02-05 02:33:18
【问题描述】:

我有一本字典,我需要根据从字符串数组中的搜索返回 tvalue。

如何返回与我正在搜索的字符串匹配的 tkey 的 tvalue 以及紧随其后的条目的 tvalue(以计算条目的长度...。这是这样我就可以访问原始文件并导入数据)。

parameters = 要查找的字符串数组。

字典 (dict) 设置为 tkey = name, tvalue = 文件开头的字节数。

input 2 是包含所有信息的文件。

        foreach (var p in parameters)
        {
            if (dict.ContainsKey(p))
            {
                int posstart = //tvalue of the parameter found;
                int posfinish = //tvalue ofnext entry ;

                using (FileStream fs = new FileStream(input[2], FileMode.Open, FileAccess.Read))
                {
                    byte[] bytes = //posstart to pos finish
                    System.Console.WriteLine(Encoding.Default.GetString(bytes));
                }
            }
            else
            {
                Console.WriteLine($"error, {p} not found");
            }
        }

欢迎任何帮助,在此先感谢您。

【问题讨论】:

  • 您是否尝试从字典中获取与键关联的值?在 C# 字典中使用dict[key] 进行索引;那是你要找的吗?此外,您说“下一个条目”,但 C# 中的字典没有排序;没有“下一个”条目。您能在这里更清楚地说明“下一个条目”是什么意思吗?听起来您的字典中有错误的信息;听起来你需要一对“开始,结束”,而不仅仅是开始。 (C# 有一个排序字典,但它按键排序,而不是值。)
  • tvalue of next entry 是什么意思? C#Dictionary 不一定保持顺序,因此要使“下一个”有意义,您必须首先根据某些标准对其进行排序。
  • 下一个条目是指紧随其后的条目,按照它被放入字典的顺序。我正在尝试返回条目的位置及其长度,以使用条目的索引及其从一开始的偏移量从文件中导入数据。我想找到钱德勒和他的信息所以“钱德勒”从文件开头的偏移量“545”字节开始。 tkey 是“chandler”,tvalue 是“545”下一个条目是“Joey”,偏移量为“884”我需要返回 545 到 884 之间的所有字节
  • 如果我必须订购它,我会订购 tvalue 的升序,有没有办法确保字典是这样的?

标签: c# dictionary


【解决方案1】:

这里的关键问题是这条评论:

// tvalue of next entry

在 C# 字典中没有排序,因此没有“下一个条目”。 (SortedDictionary 按键排序,而不是按值排序,所以这对您没有帮助。OrderedDictionary 可能是您想要的,但我们假设您手头有 Dictionary 并从那时起解决问题。)

让我们将未排序的name -> offset 数据结构转换为更好的数据结构。

假设我们从这个开始:

    // name -> offset
    var dict = new Dictionary<string, int>() { 
      { "foo", 100 }, { "bar", 40 }, { "blah", 200 } };

我们将按值对字典进行排序,并将偏移量放入这个排序列表中:

    // index -> offset
    var list = new List<int>();

然后我们将创建一个新字典,将名称映射到此列表中的索引:

    // name -> index
    var newDict = new Dictionary<string, int>();

让我们从旧字典构建列表和新字典:

    foreach (var pair in dict.OrderBy(pair => pair.Value))
    {
        newDict[pair.Key] = list.Count;
        list.Add(pair.Value);
    }

我们还需要最后一个字节的偏移量作为列表中的最后一项:

    list.Add(theOffsetOfTheLastByte);

现在我们可以进行两步查找来获取偏移量和下一个偏移量。首先我们按名称查找索引,然后按索引查找偏移量:

    int fooIndex = newDict["foo"]; // 1
    int fooOffset = list[fooIndex]; // 100
    int nextIndex = fooIndex + 1;
    int nextOffset = list[nextIndex]; // 200

有意义吗?

【讨论】:

  • 请注意,如果您在生产代码中遇到此类问题,您可能希望将此解决方案包装在包含私有集合成员的类中。这是这个概念的an example
  • @Brian:这很好。如果您的问题需要通过两个数据结构(例如列表和字典)协同工作来解决,那么请创建第三个数据结构来封装您需要的功能。
  • 埃里克回答得好!
猜你喜欢
  • 1970-01-01
  • 2020-07-16
  • 2011-12-24
  • 2020-08-06
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多