全部,我想创建一个对象数组foo[]
,其中Foo
的构造函数是
public Foo(string name, string discription){}
我有一个数据库对象,它有一个结构(为简单起见,不包括存储过程,函数或视图),如
public class Database
{
public string name { get; set; }
public string filename { get; set; }
public List<Table> tables { get; set; }
public Database(string name, string filename)
{
this.name = name;
this.filename = filename;
}
}
protected internal class Table
{
public string name { get; set; }
public List<Column> columns { get; set;}
public Table(string name, List<Column> columns)
{
this.name = name;
this.columns = columns;
}
}
protected internal class Column
{
public string name { get; set; }
public string type { get; set; }
public Column(string name, string type, int maxLength,
bool isNullable)
{
this.name = name;
this.type = type;
}
}
我想知道将Column
和Table
信息添加到Foo[]
对象数组的最快方法吗?
显然我可以做到
List<Foo> fooList = new List<Foo>();
foreach (Table t in database.tables)
{
fooList.Add(new Foo(t.Name, "Some Description"));
foreach (Column c in t.columns)
fooList.Add(new Foo(c.Name, "Some Description"));
}
Foo[] fooArr = fooList.ToArray<Foo>();
但是有更快的方法吗?显然,对于执行simalar操作的查询,LINQ可能会更慢,但我关心速度,所以任何建议都会受到赞赏。或许可以使用HashSet,因为不会有重复的条目......
感谢您的时间。
答案 0 :(得分:2)
您可以使用正确的大小初始化数组,并且只使用它而不使用支持列表:
int size = db.tables.Sum(t => t.columns.Count + 1);
Foo[] fooArr = new Foo[size];
int currentSize = 0;
foreach (var tbl in db.tables)
{
fooArr[currentSize++] = new Foo(tbl.Name, "Some Discription");
foreach(var c in tbl.columns)
fooArr[currentSize++] = new Foo(c.Name, "Some Discription");
}
答案 1 :(得分:2)
我会说你将foreach循环更改为for循环,如此处所讨论In .NET, which loop runs faster, 'for' or 'foreach'? 数据结构方面,你确实需要可变结构,除非你确切知道将要插入fooList的记录数量,那么你可以使用Array而不是list。根据foreach与for循环问题的答案,假设它是正确的,List上的循环比List上的foreach循环便宜2倍以上,并且数组上的循环比List上的循环便宜约2倍。
所以2改进是:
将foreach更改为
使用linq计算数组的长度 根据@Tim Schmelter,将List更改为Array