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;
    }
}

オブジェクト配列ColumnTable情報を追加する最も簡単な方法を知りたいですか?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>();

しかし、もっと速い方法はありますか?明らかに、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とfor-loopの質問の回答によると、それが正しいと仮定すると、ListのforループはListのforeachループよりも2倍以上安く、配列のループはListのループよりも約2倍安くなります。

したがって、2つの改善は次のようになります。

  1. foreachをforに変更します

  2. linqを使用して、@ Tim Schmelterに従って配列の長さを計算し、リストを配列に変更します

于 2012-12-19T23:07:45.333 に答える