【问题标题】:Dictionary or List字典或列表
【发布时间】:2011-02-09 01:22:24
【问题描述】:

我有一些与一些双精度值相关的字符串。我需要能够轻松地按值对它们进行排序,并轻松地将字符串作为某种列表获取。这些对可能有 100k+。

所以,我的问题是,我应该使用以字符串为键、双精度为值的字典,还是使用具有相同键和值的 KeyValuePair 列表?

如果是字典,很容易通过

将键作为列表获取

dict.Keys.toList()

如果是列表,很容易通过

按值排序

list.Sort(delegate(KeyValuePair x, KeyValuePair y) { return y.Value.CompareTo(x.Value); }).

不过,我还没有找到一种方法来做到这两点。你有什么推荐的?

【问题讨论】:

  • 所有的双精度值都是唯一的吗?
  • 除了@Matt Ellen 的问题,您是否需要通过字符串键进行查找?您只说按值排序并获取字符串,但没有说明您是否进行查找。
  • 马特,双打不一定是唯一的,但字符串是唯一的。
  • Jason,我不需要通过字符串键进行查找。

标签: c# sorting key-value


【解决方案1】:

我会推荐SortedList<double, string>。这听起来正是您想要的:

  • 自动按double 值排序(Keys 属性)
  • 可以通过Values 属性按顺序访问字符串

当然,这仅适用于您的 double 值是唯一的。否则,您可能会在自己的集合中包含 SortedList<double, List<string>>,例如:

class DoubleStringList
{
    SortedList<double, List<string>> _strings = new SortedList<double, List<string>>();

    public void Add(string str, double value)
    {
        List<string> list;
        if (!_strings.TryGetValue(value, out list))
        {
            _strings[value] = list = new List<string>();
        }

        list.Add(str);
    }

    public IEnumerable<KeyValuePair<double, string>> GetEntries()
    {
        var entries = from entry in _strings
                      from str in entry.Value
                      select new KeyValuePair<double, string>(entry.Key, str);

        return entries;
    }
}

【讨论】:

    【解决方案2】:

    这是选择 KeyValue 列表中值为 1 的所有字符串或从键值对中选择所有字符串的 1 种方法

    List<string> onestrings = list.Where(a=>a.Value == 1).Select(a => a.Key).ToList();
    List<string> allstrings = list.Select(a => a.Key).ToList();
    

    【讨论】:

      【解决方案3】:

      一个主要考虑因素是您的价值观是否独特。如果不是,字典将不起作用,因为它需要唯一的键。排序也会更加困难。

      如果您只是使用它来存储值对,并且没有唯一性约束,我个人会使用List&lt;Tuple&lt;double,string&gt;&gt;

      【讨论】:

        【解决方案4】:

        我假设给定的双精度值有多个字符串。

        您仍然可以通过其他方式进行操作:Dictionary&lt;double, list&lt;string&gt;&gt;

        所以你会把双精度值作为键,当你得到一个具有相同双精度值的字符串时,你将它添加到列表中。

        这样你可以得到字典的查找速度,并且你仍然可以在需要的时候做一些键。

        【讨论】:

        • 对字典中的键进行排序,然后按顺序检索所有元素并不是一个快速的操作。如果这是主要用例,列表可能会更好。
        • @Reed:是的。我真的需要摆脱假设东西的习惯(例如,一旦他们在字典中,他们就不想对键进行排序)
        【解决方案5】:

        Lookup 怎么样?

        Dictionary<string,double> dic = new Dictionary<string,double>();
        ILookup<double,string> lookup = dic.ToLookup(kvp => kvp.Value, kvp => kvp.Key);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-09
          • 1970-01-01
          • 2018-02-06
          • 1970-01-01
          • 2013-04-18
          • 2016-03-31
          相关资源
          最近更新 更多