【发布时间】:2010-11-22 17:23:22
【问题描述】:
我想以轻量级结构存储键值对列表的列表。这似乎太麻烦了。什么更好? List
【问题讨论】:
-
你在优化什么?结构将如何使用?标题听起来像是您正在优化类型声明中的字符数;)
-
是的,我只是想让它看起来不那么麻烦:)
标签: c# list types collections generics
我想以轻量级结构存储键值对列表的列表。这似乎太麻烦了。什么更好? List
【问题讨论】:
标签: c# list types collections generics
考虑使用别名作为速记:
namespace Application
{
using MyList = List<List<KeyValuePair<string, string>>>;
public class Sample
{
void Foo()
{
var list = new MyList();
}
}
}
【讨论】:
List 和 Dictionary 都非常有效,所以我不会三思而后行。 (除非您要在列表中存储大量字典,但这并不常见。)
如果您认为List<Dictionary<string, string>> 输入过多,可以在序言中说明
using LoDSS = System.Collections.Generic.List<System.Collections.Generic.Dictionary<string, string>>;
请注意,这只是一个别名,不需要子类化。
【讨论】:
Dictionary 和 List> 都可以,具体取决于您要传递的数据。此外,如果您要在所有地方使用相同的长类型,您可以在其他地方定义类型作为速记。像这样的:
public class MyShorthand : List<List<KeyValuePair<string, string>>> { }
或者您可以使用 using 语句来定义类型别名,如下所示:
using MyShorthand = System.Collections.Generic.List<System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, string>>>;
【讨论】:
using MyShorthand = List<List<KeyValuePair<string, string>>>;
sealed 类型的问题 - 在这种情况下不是问题,但是......
如果您通过键访问值,请使用字典,这就是本意。要减少字典的开销,请尝试给它们一个初始容量。
或者(如果两个列表都相当小),您可以实现自定义散列对象,如下所示(除了更漂亮):
public class MyDictionary
{
private Dictionary<string, string> values;
public MyDictionary()
{
values = new Dictionary<string, string>();
}
public void Add(int index, string key, string value)
{
int hash = ((0xFFFF) & index) * (0xFFFF) + (0xFFFF) & key.GetHashCode();
values.Add(hash, value);
}
public string Get(int index, string key)
{
int hash = ((0xFFFF) & index) * (0xFFFF) + (0xFFFF) & key.GetHashCode();
return values[hash];
}
}
【讨论】:
为清楚起见,我会将您的 KeyValuePair<string, string> 包装成更短的内容,例如StringPair 并且还定义了 StringPair 列表的简写。这将缩短您的语法并提高可读性恕我直言。
public class StringPair : KeyValuePair<string, string> { }
public class StringPairList : List<stringPair> { }
..
var jaggedList = new List<StringPairList>();
【讨论】: