Я проанализировал сетку данных Excel и создал объектную модель. Есть 32 столбца и 100 000 строк. Меня попросили проверить строки с дублирующимися данными и сообщить о них. Для моей реализации я делаю следующее:C# collection performance: Hashset <string> и словарь <string, IList <int>> самые быстрые коллекции для этой цели?
- Использование задач Я строю массив кортежей с идентификатором строки и конкатенированным содержимым ячеек.
- I контур через результирующий массив и используя HashSet, я пытаюсь вставить сцепленное значение в HashSet:
- Если HashSet.Add() проходит, я создаю новую запись в моем словаре> результата установить для него.
- Если HashSet.Add() не могу добавить, что идентификатор строки в существующую запись в мой мой словарь> Результирующий набор
Шаг 1 принимает 0.09s, в то время как остальные принимают 822s к процессу:/Может кто-нибудь где я могу отрубить это время с более подходящим выбором коллекций или алгоритмов?
код ниже:
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;
}
}
Это на самом деле не имеет ничего общего о '' Hashset' против производительности Dictionary'. Название похоже на подобное, но внимательно прочитайте вопрос. OP просит о поиске дубликатов среди 200000 строк. –
* «Шаг 1 занимает 0.09s, а остальное занимает 822s для обработки: /" *. На самом деле это не так. Для асинхронного запуска ваших задач требуется 0,09 с. Однако, когда вы пытаетесь получить доступ к 'task.Result', он блокирует поток. –
Я проголосовал за открытие, так как у @ Йельдара Курмангалиева были веские аргументы. Тем не менее, [этот пост] (http://stackoverflow.com/q/2728500/993547) полезен. –