私はExcelデータのグリッドを解析し、オブジェクトモデルを構築しました。 32の列と100,000の行があります。私は重複したデータを持つ行をチェックして報告するように求められてきました。私の実装では、私は次のことをやっています:C#コレクションのパフォーマンス:この目的のために、Hashset <string>とDictionary <string、IList <int>>が最速のコレクションですか?
- 私は行IDと連結セルの内容を持つタプルの配列を構築しています。
- 結果セットをループし、HashSetを使用して、連結された値をHashSetに挿入しようとします。
- HashSet.Add()がパスすると、辞書>結果セットに新しいエントリが作成されます。 HashSet.Addは()の結果は、残りはプロセスに822sを取っている間、ステップ1は、0.09s取る
設定>私は私の辞書の既存のエントリにその行番号を追加し失敗した場合
コードは以下の通りです:このような状況の問題で
var results = new Dictionary<string, IList<int>>(numberOfRows);
var hashSet = new HashSet<string>();
var duplicateErrors = new List<string>();
for (var row = firstRow; row <= lastRow; row++)
{
var row1 = row;
taskArray[count++] =
Task<Tuple<int, string>>.Factory.StartNew(() => GetCompleteRowData(row1, tableRawDataHolders));
}
foreach (var task in taskArray)
{
if (hashSet.Add(task.Result.Item2))
{
results.Add(task.Result.Item2, new List<int>() { task.Result.Item1 });
}
else
{
results[task.Result.Item2].Add(task.Result.Item1);
}
}
と
public Tuple<int, string> GetCompleteRowData(int row, IEnumerable<ITableRawDataHolder> tableRawDataHolders)
{
return new Tuple<int, string>(row, string.Join("",
tableRawDataHolders.Where(c => c.Row == row).Select(c => c.Value).ToArray()));
}
と
public class TableRawDataHolder : ITableRawDataHolder
{
public int Row { get; }
public int Column { get; }
public string Value { get; }
public TableRawDataHolder(int row, int column, string value)
{
Row = row;
Column = column;
Value = value;
}
}
それは実際に 'Dictionary'性能対Hashset''については何の関係もありません。タイトルは同じように見えますが、質問を慎重に読んでください。 OPは、200000行の間で重複を探すことを求めている。 –
* "ステップ1には0.09秒かかりますが、残りは822秒で処理されます:/" *。それは実際にはありません。非同期でタスクを開始するには、0.09秒かかります。しかし、 'task.Result'にアクセスしようとすると、スレッドをブロックします。 –
@YeldarKurmangaliyevがいくつかの良い議論をして以来、私は再開することを表明しました。それでも、[この投稿](http://stackoverflow.com/q/2728500/993547)が便利です。 –