1

私は 2 つの DataTables を持っています: 携帯電話番号を含む TableNumber と、すべて 6 桁の長さの可能なすべての携帯電話コードの組み合わせを含む TableCode です。最初の 6 桁が TableCode の数字のみを持つリストを作成したいので、最初の 6 桁が TableCode にない数字は考慮されません。foreach、.Contains()、IndexOf() でこれを試しましたが、数値のレコードが 100,000 を超え、すべての項目をループするには時間がかかりすぎるため、すべてが遅くなります。別のテーブルと比較します。ネストされた foreach ループを 2 つ使用します。テーブルコードから30,000人のメンバーに対して30億回の検索が行われ、結果が得られるまでに5分かかるため、2つのforeachで何か愚かなことをしています。私のコードは次のようなものです:

foreach(string codetable in TableCode)
     {
          foreach(string grouptable in TableNumber)
                 {
                    if(grouptable.IndexOf(codetable)!=-1)
                    {
                        //work here
                    }
                 }
     }

ここでは、テーブルの番号行を数字のみを含むリストに追加したので、ここでリストを検索していますが、DataTables を再度比較しようとすると時間がかかりすぎます。

4

2 に答える 2

3

おそらく、次のようにデータテーブルをIEnumerableに変換します。DataTableをIEnumerable<T>に変換します。

次に、yield returnを使用し、別のスレッドで処理を処理するか、フィルタリングにLINQを使用します。

たぶん、テーブルにいくつかの並べ替えを実装し、それらを小さなチャンクに分割して、並列処理のためにより多くのスレッドを生成します。

于 2013-03-05T09:04:33.500 に答える
1

-TableNumberをフィルタリングするために使用する「ポジティブ」テーブルも同様です。 TableCodeDataTable

したがって、モデルは次のようになります。

var TableNumber = new DataTable();
var TableCode = new DataTable();
TableNumber.Columns.Add("MobileNumbers", typeof(string));
TableCode.Columns.Add("MobileCode", typeof(string));

HashSet<string>次に、すべての有効な数値でa を使用Enumerable.Joinし、2 番目のテーブルの行を有効な数値にリンクできます。

var numbersFirst6digits = TableNumber.AsEnumerable()
    .Select(r => new string(r.Field<string>("MobileNumbers").Where(Char.IsDigit).Take(6).ToArray()));
var dictionary = new HashSet<string>(numbersFirst6digits);

var validCodeRows = from row in TableCode.AsEnumerable()
                    join num in dictionary
                    on row.Field<string>("MobileCode") equals num
                    select row;
// if you need a new DataTable:
DataTable tblValidCodes = validCodeRows.CopyToDataTable();

最初の 6 桁の最初のテーブルをフィルター処理する必要がない場合は、次の行を置き換えることができます。

.Select(r => new string(r.Field<string>("MobileNumbers").Where(Char.IsDigit).Take(6).ToArray()));

.Select(r => {var mNum = r.Field<string>("MobileNumbers"); return mNum.Length < 6 ? mNum : mNum.Substring(0, 6)};);
于 2013-03-05T09:24:27.520 に答える