我有一个应用程序,在启动时加载10 List<myClass>
。
我的工作加载有点慢,我在考虑使用数组而不是List<T>
。
我的代码:
List<MyClass> objects = MyClass.Get();
foreach (MyClass c in objects)
{
comboBox.Items.Add(c.Text);
}
class MyClass
{
//some properties
public MyClass(string key)
{
//Database is another class for executing sql queries.
//GetString(int columnIndex, int rowIndex)
using (DataBase db = new DataBase())
{
db.Query = "SELECT ID FROM sampleTable WHERE ID= @param";
db.Parameters.Add("param", SqlDbType.NVarChar, 100, key);
Name = db.GetString(0, 0);
}
}
public static List<MyClass> Get()
{
using (Database db = new Database())
{
db.Query = "SELECT ID FROM sampleTable ORDER BY sampleTextField";
int c = db.GetRowCount();
List<MyClass> result = new List<MyClass>();
for (int i = 0; i < c; i++)
{
result.Add(new MyClass(db.GetString(0, i)));
}
return result;
}
}
}
使用数组是个好主意吗?
请随时向我提出加速此代码的任何想法。
答案 0 :(得分:2)
您必须使用类似Stopwatch
的内容来确定时间。
但是,我猜它几乎没有什么区别,因为时间会被数据库访问的开销完全淹没。
因此,您应该专注于加速数据库访问,而不是担心使用数组或列表。但在你做任何其他事情之前,请检查你的程序(使用Stopwatch
),以便你知道时间的去向。
答案 1 :(得分:0)
用数组测试它,并计时!我最近做了类似的事情,发现通常数组的速度要快一些,但列表编码通常更容易。 C#擅长列表,不像C ++,我曾经发现数组比矢量有更大的好处。
答案 2 :(得分:0)
由于您知道列表的最终大小,因此您可以通过在构建时设置列表容量来加快速度。
List<MyClass> result = new List<MyClass>(c);
这样做可以避免重新分配底层数组。否则,我认为你没有任何更重要的开销。
答案 3 :(得分:0)
我怀疑使用List是一个瓶颈。使用数组,您需要提前知道大小,以便正确地对数组进行尺寸标注:
MyClass[] result = new MyClass[c];
for (int i = 0; i < c; i++)
{
result[i] = new MyClass(db.GetString(0, i));
}
但是如果您事先了解了大小,就可以以相同的方式将列表初始化为所需的容量,从而避免重新分配并提供几乎相同的性能:
List<MyClass> result = new List<MyClass>(c);
for (int i = 0; i < c; i++)
{
result.Add(new MyClass(db.GetString(0, i)));
}
但是我要重申,这不太可能产生太大的影响。
答案 4 :(得分:0)
List internaly使用数组,但如果使用得当,开销很低。
在您的代码中,您可以预先分配所需的容量:
int c = db.GetRowCount();
List<MyClass> result = new List<MyClass>(c); //capacity
for (int i = 0; i < c; i++)
{
result.Add(new MyClass(db.GetString(0, i)));
}
无论如何,您必须对您的代码进行分析,以确保花费时间。