0

列のグループのそれぞれが重複している DataTable 内のすべての行を検索したいと考えています。私の現在の考えは、次のように複数回表示されるすべての行のインデックスのリストを取得することです。

public List<int> findDuplicates_New()
        {
            string[] duplicateCheckFields = { "Name", "City" };
            List<int> duplicates = new List<int>();
            List<string> rowStrs = new List<string>();
            string rowStr;

            //convert each datarow to a delimited string and add it to list rowStrs
            foreach (DataRow dr in submissionsList.Rows)
            {
                rowStr = string.Empty;
                foreach (DataColumn dc in submissionsList.Columns)
                {
                    //only use the duplicateCheckFields in the string   
                    if (duplicateCheckFields.Contains(dc.ColumnName))
                    {
                        rowStr += dr[dc].ToString() + "|";
                    }
                }
                rowStrs.Add(rowStr);
            }

            //count how many of each row string are in the list
            //add the string's index (which will match the row's index)
            //to the duplicates list if more than 1
            for (int c = 0; c < rowStrs.Count; c++)
            {
                if (rowStrs.Count(str => str == rowStrs[c]) > 1)
                {
                    duplicates.Add(c);
                }
            }
            return duplicates;
        }

ただし、これはあまり効率的ではありません。文字列のリストを調べて各文字列の数を取得するには O(n^2) です。このソリューションを見ましたが、複数のフィールドで使用する方法がわかりませんでした。この問題を処理するための安価な方法を探しています。

4

1 に答える 1

1

これを試して:

各行に 70 以上の列があるテーブルで完全一致を確認するにはどうすればよいですか?

本質は、行のハッシュを保存し、衝突するハッシュを持つ行間の比較のみを行うセットを作成することです。複雑さは O(n) になります

...

多数の行があり、ハッシュ自体の保存が問題になる場合(ありそうもないケースですが...)、ブルーム フィルターを使用できます。ブルーム フィルターの中心となるアイデアは、各行のいくつかの異なるハッシュを計算し、それらをビットマップ内のアドレスとして使用することです。行をスキャンしていると、以前に設定されたビットマップのすべてのビットが既にある行を再確認できます。

于 2013-04-24T18:30:46.890 に答える