【问题标题】:What is the advantage of using a Two Item Tuple versus a Dictionary?与字典相比,使用两项元组的优势是什么?
【发布时间】:2014-06-14 08:52:19
【问题描述】:

我有返回 IWebElements 列表及其对应名称的代码?我的理解是一个包含两个项目的元组基本上是同一件事,但字典使用哈希映射来关联这两个值。与字典相比,使用双项元组有什么优势,反之亦然?

public Dictionary<IWebElement, string> SelectAllOptions(IWebDriver driver, ref DataObject masterData)
    {
        //Get the ID of the dropdown menu
        DatabaseRetrieval.GetObjectRepository(ref masterData);
        var strDropMenuId = masterData.DictObjectRepository["ID"];
        //Find the dropdown menu and pull all options into a list
        try
        {
            var dropMenu = new SelectElement(driver.FindElement(By.Id(strDropMenuId)));
            // TODO want to know how we want this list to return. 
            var options = dropMenu.Options as List<IWebElement>;
            if (options != null)
            {
                var values = options.ToDictionary(option => option, option => option.Text);
                return values;
            }
        }

【问题讨论】:

  • A Tuple&lt;T1, T2&gt; 类似于KeyValuePair&lt;TKey, TValue&gt;,而不是字典。 (字典包含一系列键值对。
  • 我很好奇为什么当对象已经引用了它自己的名字(option.Text)时,你甚至需要一个具有相应名称的对象列表......
  • 我看的时候也是这么想的,但是同事出于某种原因需要一个列表或者字符串数组。

标签: c# .net dictionary tuples


【解决方案1】:

作为一般规则,您不想为您的程序不需要的可能性“付费” *。例如,如果您的程序对检索和处理一系列对(也称为“双元组”)感兴趣,但它不需要执行从元组的第一个成员到第二个成员的查找,那么提供一个集合对更有效:

IEnumerable<Tuple<IWebElement, string>> SelectAllOptions(...)
  • 这种方法占用的内存更少,因为您不为哈希桶分配空间
  • 这种方法占用的 CPU 更少,因为没有哈希键计算或冲突解决成本
  • 这种方法不会向读者暗示数据是用于查找的。​​li>

当然,如果您返回的数据结构 用于查找,那么您应该返回一个字典,或者在客户端构建一个字典,以将一些 CPU 负载从服务器转移到客户。

* 与内存、CPU 周期、可读性降低等有关。

【讨论】:

  • 我认为这应该被标记为正确答案,因为它更好地说明了用例的差异。
【解决方案2】:

Tuple&lt;T1, T2&gt; 表示一对值。这对不一定意味着“这两个项目是相关的”。当使用KeyValuePair&lt;TKey, TValue&gt; 时,你会期望给定一个键,你会得到一个值,并且两者之间会有某种联系。

元组实现IComparableIStructuralEquatable,这使得比较元组更容易。 除此之外,我会从逻辑的角度来看,我是否需要将给定的键与值匹配?或者我只需要将两个值耦合在一起,一个类可能会有点开销。

在我看来,元组的一个缺点是您必须处理标记为 Item1 和 Item2 的属性,这可能会使其可读性降低。

另外,请记住,元组是 class(不可变的),KeyValuePair 是结构,因此当您将它们作为参数传递时,您通过引用传递元组并通过值传递 KeyValuePair(除非显式声明 @987654327 @或out)

【讨论】:

  • 您现在可以使用命名元组。
【解决方案3】:

元组优于字典的一个优点是元组可以命名。 使用List&lt;(string text, string url)&gt; linksDictionary&lt;string, string&gt; links 更有意义。

【讨论】:

    【解决方案4】:

    为了补充其他答案,将键值数据存储为元组列表而不是字典有时会有好处。

    根据您的需要,快速查找可能并不重要,但您插入到列表中的顺序保持固定可能很重要。您可以遍历字典中的键和值,但未定义顺序。

    另一个优点是您可以根据需要将具有相同第一个元素的任意多对放入列表中,而对于字典,每个唯一键只能有一个值。

    【讨论】:

      猜你喜欢
      • 2019-12-13
      • 2016-07-03
      • 2010-09-24
      • 2010-12-27
      • 2015-04-06
      • 2013-05-09
      • 2017-05-29
      • 2017-11-24
      • 1970-01-01
      相关资源
      最近更新 更多