diff --git a/src/UglyToad.PdfPig.Core/IndirectReference.cs b/src/UglyToad.PdfPig.Core/IndirectReference.cs
index c742280d8..f7f38b598 100644
--- a/src/UglyToad.PdfPig.Core/IndirectReference.cs
+++ b/src/UglyToad.PdfPig.Core/IndirectReference.cs
@@ -6,7 +6,7 @@
///
/// Used to uniquely identify and refer to objects in the PDF file.
///
- public readonly struct IndirectReference
+ public readonly struct IndirectReference : IEquatable
{
///
/// A positive integer object number.
@@ -31,15 +31,15 @@ public IndirectReference(long objectNumber, int generation)
}
///
- public override bool Equals(object obj)
+ public bool Equals(IndirectReference other)
{
- if (obj is IndirectReference reference)
- {
- return reference.ObjectNumber == ObjectNumber
- && reference.Generation == Generation;
- }
+ return other.ObjectNumber == ObjectNumber && other.Generation == Generation;
+ }
- return false;
+ ///
+ public override bool Equals(object obj)
+ {
+ return obj is IndirectReference other && Equals(other);
}
///
diff --git a/src/UglyToad.PdfPig/CrossReference/CrossReferenceTable.cs b/src/UglyToad.PdfPig/CrossReference/CrossReferenceTable.cs
index fe404ea2c..91be7106c 100644
--- a/src/UglyToad.PdfPig/CrossReference/CrossReferenceTable.cs
+++ b/src/UglyToad.PdfPig/CrossReference/CrossReferenceTable.cs
@@ -49,7 +49,7 @@ internal CrossReferenceTable(CrossReferenceType type, IReadOnlyDictionary();
+ var result = new Dictionary(capacity: objectOffsets.Count);
foreach (var objectOffset in objectOffsets)
{
result[objectOffset.Key] = objectOffset.Value;
diff --git a/src/UglyToad.PdfPig/Parser/FileStructure/CrossReferenceObjectOffsetValidator.cs b/src/UglyToad.PdfPig/Parser/FileStructure/CrossReferenceObjectOffsetValidator.cs
index 54eea31d0..f2449b39f 100644
--- a/src/UglyToad.PdfPig/Parser/FileStructure/CrossReferenceObjectOffsetValidator.cs
+++ b/src/UglyToad.PdfPig/Parser/FileStructure/CrossReferenceObjectOffsetValidator.cs
@@ -24,11 +24,12 @@ public static bool ValidateCrossReferenceOffsets(IInputBytes bytes, CrossReferen
return true;
}
- var builderOffsets = new Dictionary();
-
var bruteForceOffsets = BruteForceSearcher.GetObjectLocations(bytes);
if (bruteForceOffsets.Count > 0)
{
+ // Pre-allocate capacity for at least the bruteForceOffsets, since we'll be adding all of them
+ var builderOffsets = new Dictionary(bruteForceOffsets.Count);
+
// find all object streams
foreach (var entry in crossReferenceTable.ObjectOffsets)
{
@@ -39,11 +40,11 @@ public static bool ValidateCrossReferenceOffsets(IInputBytes bytes, CrossReferen
// TODO: more validation of streams.
builderOffsets[entry.Key] = entry.Value;
}
+ }
- foreach (var item in bruteForceOffsets)
- {
- builderOffsets[item.Key] = item.Value;
- }
+ foreach (var item in bruteForceOffsets)
+ {
+ builderOffsets[item.Key] = item.Value;
}
actualOffsets = builderOffsets;