Skip to content

Commit 40d60a1

Browse files
ericstjcarlossanlop
authored andcommitted
ZipArchive: Improve performance or removing extra fields
This improves the performance of the `ZipArchive` by optimizing the removal of extra fields. - `src/libraries/System.IO.Compression/src/System/IO/Compression/ZipBlocks.cs`: Replaced multiple iterations and list operations with a single `RemoveAll` call to remove specific `ZipGenericExtraField` entries.
1 parent 7442e7d commit 40d60a1

File tree

1 file changed

+5
-13
lines changed
  • src/libraries/System.IO.Compression/src/System/IO/Compression

1 file changed

+5
-13
lines changed

src/libraries/System.IO.Compression/src/System/IO/Compression/ZipBlocks.cs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -237,14 +237,12 @@ public static Zip64ExtraField GetAndRemoveZip64Block(List<ZipGenericExtraField>
237237
zip64Field._localHeaderOffset = null;
238238
zip64Field._startDiskNumber = null;
239239

240-
List<ZipGenericExtraField> markedForDelete = new List<ZipGenericExtraField>();
241240
bool zip64FieldFound = false;
242241

243-
foreach (ZipGenericExtraField ef in extraFields)
242+
extraFields.RemoveAll(ef =>
244243
{
245244
if (ef.Tag == TagConstant)
246245
{
247-
markedForDelete.Add(ef);
248246
if (!zip64FieldFound)
249247
{
250248
if (TryGetZip64BlockFromGenericExtraField(ef, readUncompressedSize, readCompressedSize,
@@ -253,24 +251,18 @@ public static Zip64ExtraField GetAndRemoveZip64Block(List<ZipGenericExtraField>
253251
zip64FieldFound = true;
254252
}
255253
}
254+
return true;
256255
}
257-
}
258256

259-
foreach (ZipGenericExtraField ef in markedForDelete)
260-
extraFields.Remove(ef);
257+
return false;
258+
});
261259

262260
return zip64Field;
263261
}
264262

265263
public static void RemoveZip64Blocks(List<ZipGenericExtraField> extraFields)
266264
{
267-
List<ZipGenericExtraField> markedForDelete = new List<ZipGenericExtraField>();
268-
foreach (ZipGenericExtraField field in extraFields)
269-
if (field.Tag == TagConstant)
270-
markedForDelete.Add(field);
271-
272-
foreach (ZipGenericExtraField field in markedForDelete)
273-
extraFields.Remove(field);
265+
extraFields.RemoveAll(field => field.Tag == TagConstant);
274266
}
275267

276268
public void WriteBlock(Stream stream)

0 commit comments

Comments
 (0)