0

こんにちは、Linq を学習しようとしているので、これができるかどうかわかりません。

インポート プロジェクト に取り組んでいる ので、DataSet を使用してデータをインポートすることにしました。

この時点での私の課題: スキーマが異なる 2 つの DataTables があり、そのうちの 1 つには宛先スキーマが含まれ、もう 1 つにはソース スキーマが含まれています。

私がする必要があるのは、目的の列に「ある程度似ている」ソース列を特定できる列の一致を実行することです。この時点で、送信先の列名の一部がソースに含まれている場合、一致する可能性があるものを探しています 。可能性を判断する方法はわかりません。

たとえば、ソース [名、姓、アドレス] - > 宛先 [fname、lname、addr1]

では、LINQ はこの仕事の潜在的な候補でしょうか? それとも正規表現?私はこれで始めました

ソースDataTable dtを持つ

var Lcols = from c in dt.Columns.Cast<System.Data.DataColumn>()
select c.ColumnName;

ここからどこへ行けばいいのかわからない...

ありがとうございました!

4

1 に答える 1

1

ここではLINQ候補になる可能性がありますが、定義する必要があるのは(まだ定義していない場合)、列がどのように似ているかだと思います。カットオフポイントは?ある列を別の列にマップできる条件が整ったら、それらの条件を 2 つのセットのデカルト積に適用できます (ソースの列が最初のセットで、2 番目の列が宛先の列です)。潜在的な一致のリストを取得します。


次のように、ソース列と宛先列があると仮定します。

IEnumerable<DataColumn> sourceColumns = 
  sourceDt.Columns.Cast<System.Data.DataColumn>();
IEnumerable<DataColumn> destColumns =
  destDt.Columns.Cast<System.Data.DataColumn>();

そして、IDictionary<string, string>ソースの列の名前を宛先の列の名前にマップした場合、次のことができます。

var map =
  from s in sourceColumns
  from d in destColumns
where
  // colMap is the IDictionary<string, string>
  // The map has to contain the key.
  colMap.ContainsKey(s.ColumnName) &&

  // The destination column has to match the column map.
  // The OrdinalIgnoreCase option means to ignore case.
  string.Compare(colMap[s.ColumnName], 
      d.ColumnName, CompareOptions.OrdinalIgnoreCase) == 0
select
  new { SourceColumn = s, DestinationColumn = d };

これにより、辞書の項目に基づいて可能なマッピングが得られます。

于 2009-02-11T18:49:46.700 に答える