Cómo manejar la descompresión de ZipFile con rutas que son demasiado largas / duplicadas

Al descomprimir archivos en Windows, ocasionalmente tendré problemas con las rutas

eso es demasiado largo para Windows (pero está bien en el sistema operativo original que creó el archivo).que son "duplicados" debido a la insensibilidad a los casos

Usando DotNetZip, elZipFile.Read(path) La llamada se cagará cada vez que lea archivos zip con uno de estos problemas. Lo que significa que ni siquiera puedo intentar filtrarlo.

using (ZipFile zip = ZipFile.Read(path))
{
    ...
}

¿Cuál es la mejor manera de manejar la lectura de ese tipo de archivos?

Actualizado:

Ejemplo zip desde aquí:https://github.com/MonoReports/MonoReports/zipball/master

Duplicadoshttps://github.com/MonoReports/MonoReports/tree/master/src/MonoReports.Model/DataSourceType.cs https://github.com/MonoReports/MonoReports/tree/master/src/MonoReports.Model/DatasourceType.cs

Aquí hay más detalles sobre la excepción:

Ionic.Zip.ZipException: No se puede leer eso como un archivo Zip
---> System.ArgumentException: Ya se ha agregado un elemento con la misma clave.
en System.ThrowHelper.ThrowArgumentException (recurso ExceptionResource)
en System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add)<br>at System.Collections.Generic.Dictionary2.Agregar (tecla TKey, valor de TValue)
en Ionic.Zip.ZipFile.ReadCentralDirectory (ZipFile zf)
en Ionic.Zip.ZipFile.ReadIntoInstance (ZipFile zf)

Resolución:

Basándome en la sugerencia de @ Cheeso, puedo leer todo el contenido de la secuencia, aquellos que evitan duplicados y problemas de ruta:

//using (ZipFile zip = ZipFile.Read(path))
using (ZipInputStream stream = new ZipInputStream(path))
{
    ZipEntry e;
    while( (e = stream.GetNextEntry()) != null )
    //foreach( ZipEntry e in zip)
    {
        if (e.FileName.ToLower().EndsWith(".cs") ||
            e.FileName.ToLower().EndsWith(".xaml"))
        {
            //var ms = new MemoryStream();
            //e.Extract(ms);
            var sr = new StreamReader(stream);
            {
                //ms.Position = 0;
                CodeFiles.Add(new CodeFile() { Content = sr.ReadToEnd(), FileName = e.FileName });
            }
        }
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta