0

所有,我想创建一个对象数组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的最快方法?TableFoo[]

显然我能做到

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>();

但是有更快的方法吗?显然,对于执行类似操作的查询,LINQ 可能会更慢,但我关心这里的速度,所以任何建议都会受到赞赏。也许使用 HashSet 将是要走的路,因为不会有重复的条目......

谢谢你的时间。

4

2 回答 2

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");
}
于 2012-12-19T22:48:50.170 回答
2

我会说将您的 foreach 循环更改为 for 循环,如此处所述在 .NET 中,哪个循环运行得更快,“for”还是“foreach”? 数据结构方面,您确实需要可变结构,除非您确切知道将要插入多少条记录到 fooList 中,否则您可以使用数组而不是列表。根据foreach vs for-loop问题的答案,假设它是正确的,List上的for循环比List上的foreach循环便宜2倍多,而数组上的循环比List上的循环便宜约2倍。

所以 2 改进将是:

  1. 将 foreach 更改为 for

  2. 使用 linq 根据@Tim Schmelter 计算数组的长度,并将 List 更改为 Array

于 2012-12-19T23:07:45.333 回答