我有代码,我返回一个IWebElements列表及其相应的名称?我的理解是,具有两个项目的元组基本上是相同的,但是Dictionary使用哈希映射来关联这两个值。在字典上使用Two Item Tuple有什么好处,反之亦然?
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;
}
}
答案 0 :(得分:11)
作为一般规则,您不希望为您的程序不需要支付&#34; * 。例如,如果您的程序有兴趣检索和处理一对对(也称为&#34;两个成员的元组&#34;),但它不需要从元组的第一个成员执行查找到第二个,然后提供一组对更有效:
IEnumerable<Tuple<IWebElement, string>> SelectAllOptions(...)
当然,如果您返回的的数据结构用于查找,那么您应该返回一个字典,或者在客户端构造一个字典,以便将一些CPU负载从服务器传输到客户。
* 内存,CPU周期,可读性降低等
答案 1 :(得分:9)
Tuple<T1, T2>
表示一对值。那对不一定必须意味着&#34;这两个项目是相关的&#34;。当使用KeyValuePair<TKey, TValue>
时,你会期望给定一个键,你会得到一个值,两者之间会有某种联系。
元组实现IComparable
和IStructuralEquatable
,这样可以更轻松地比较元组。
除此之外,我会从逻辑角度来看待它,我是否需要将给定的键与值匹配?或者我只需要将两个值耦合在一起,而类可能会有一些开销。
我看到Tuples的一个缺点是,你必须处理标记为Item1和Item2的属性,这可能会使它的可读性降低。
另外,请记住,元组是class
(不可变的),KeyValuePair
是结构,所以当你将它们作为参数传递时,你会通过引用传递元组,而按值传递KeyValuePair(除了明确声明ref
或out
)
答案 2 :(得分:2)
元组相对于词典的一个优点是可以命名元组。
使用List<(string text, string url)> links
比Dictionary<string, string> links
更有意义。
答案 3 :(得分:1)
要添加其他答案,将键值数据存储为元组列表而不是字典中有时会有优势。
根据您的需要,查找速度可能并不重要,但插入列表的顺序可能仍然很重要。您可以遍历字典中的键和值,但未定义顺序。
另一个优点是,您可以根据需要将具有相同第一个元素的多个对放入列表中,其中对于字典,每个唯一键只能有一个值。