ファイル(CSVやExcelなど)からデータを読み込み、ファイルの各行が一意であることを確認する必要があります。オブジェクトの配列の一意性を確認する
各行はobject[]
で表されます。これは、現在のアーキテクチャのために変更することはできません。この配列内の各オブジェクトは異なるタイプ(decimal
、string
、int
など)です。
ファイルは次のようになります
foo 1 5 // Not unique
bar 1 5
bar 2 5
foo 1 5 // Not unique
ファイルが200.000+行と列4-100を持っている可能性があります。
は私が今持っているコードは次のようになります。
IList<object[]> rows = new List<object[]>();
using (var reader = _deliveryObjectReaderFactory.CreateReader(deliveryObject))
{
// Read the row.
while (reader.Read())
{
// Get the values from the file.
var values = reader.GetValues();
// Check uniqueness for row
foreach (var row in rows)
{
bool rowsAreDifferent = false;
// Check uniqueness for column.
for (int i = 0; i < row.Length; i++)
{
var earlierValue = row[i];
var newValue = values[i];
if (earlierValue.ToString() != newValue.ToString())
{
rowsAreDifferent = true;
break;
}
}
if(!rowsAreDifferent)
throw new Exception("Rows are not unique");
}
rows.Add(values);
}
}
だから、私の質問は、これはより効率的に行うことができますか?ハッシュを使用するなど、代わりにハッシュの一意性をチェックしますか?
あなたは、2つのオブジェクトが同じハッシュを持ち、まだ不等である可能性があることを認識していますか?言い換えれば、あなたのハッシュが正しく行われた場合、ファイルは重複ハッシュを持つことができますが、依然としてユニークな行を持ちます。 – phoog
HashSetをカスタム同値比較ツールで使用するとどうなりますか? –
Jehof
@phoog、はい私はそれをよく知っています。解はまずハッシュをチェックし、ハッシュが等しい場合は他の値もチェックする必要があります。しかし、常にすべての値をチェックするのではなく、ハッシュを最初にチェックするほうが効率的かもしれません。 – smoksnes