4

私は2つのコレクションを持っています。BindingSource のコレクションと DataSet のコレクション。次に、BindingSource コレクションの対応するデータ型を、DataSet コレクションのテーブル型で見つけようとします。しかし、私のアプローチはややエレガントです。LINQ を使用してどのように解決できますか?

foreach (var bindindSource in view.DataContext)
{
    var dataSource = bindindSource.DataSource;
    string sourceName = ((Type)dataSource).Name;

    foreach (var dataSet in model.DataSource)
    {
        var table = (from DataTable t in dataSet.Tables
                     where ((Type)t.GetType()).Name.Equals(sourceName)
                     select t).FirstOrDefault();
        if (table != null)
        {
            bindindSource.DataSource = table;
            break;
        }
    }
}
4

1 に答える 1

2

a を同じ名前BindingSourceの最初のものに関連付けようとしているようです。簡単なアプローチは、ルックアップに使用している名前をテーブルにマップする前もって準備することです。DataTableTypeDictionary

var tablesByName = (from set in model.DataSource 
                    from table in set.Tables 
                    select table) // get all tables of all sets
                   .ToDictionary(table => (table.GetType() as Type).Name)

(テーブルが変更されない場合、これは一static度だけ計算されるフィールドである可能性があります。)

次に、コードの残りの部分を次のように縮小する必要があります。

foreach (var source in view.DataContext) 
{
    DataTable table;
    var name = (source.DataSource as Type).Name;
    if (tablesByName.TryGetValue(name, out table))
    {
        source.DataSource = table;
    }
}

重複した名前のテーブルがあるなどの処理は省略しました。(これはToDictionary()失敗するため、その呼び出しの前に重複を取り除く必要があります。)

于 2013-05-16T14:35:53.350 に答える