저는 Excel 데이터 그리드를 파싱하여 개체 모델을 구축했습니다. 32 개의 열과 100,000 개의 행이 있습니다. 중복 데이터가있는 행을 확인하고이를보고하라는 요청을 받았습니다. 구현을 위해 다음을 수행합니다.C# 수집 성능 : Hashset <string> 및 사전 <string, IList <int>>이이 용도로 가장 빠른 컬렉션입니까?
- 작업 사용 행 ID 및 연결된 셀 내용이 포함 된 Tuple 배열을 작성합니다.
- 결과 배열을 반복하고 HashSet을 사용하여 연결된 값을 HashSet에 삽입하려고합니다.
- HashSet.Add()가 전달되면 내 Dictionary> 결과 집합에 새 항목이 만들어집니다. HashSet.Add()는 결과가 나머지 프로세스 822s 진행되는 동안 1 단계, 0.09s 소요
설정> 내 내 사전에서 기존 항목에 해당 행 ID를 추가에 실패하면
코드는 다음과 같습니다 :
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)이 유용합니다. –