Estoy tratando de encontrar duplicados en una lista de cadenas de nombres de ruta al servidor: Mis caminos se verán como \\UTIR\STORAGE\10-23-2015\DEPOSITS\123_DEPOSIT_10-23-2015_1.pdf Tendré que usar 50 de estos para verificar el final de la ruta \123_DEPOSIT_10-23-2015_1.pdf para asegurarme de que no haya duplicados.

List<string> manypaths = (List<string>)TempData["temp"];
        var list= new List<string>();
        foreach (var item in manypaths)
        {
            if(list.Contains(item))
            {
                
            }
            else
            {
                list.Add(item);
            }
        }

Estoy usando la biblioteca dotnetzip y he intentado ContainsEntry, Contains. Y todo lo demás que he encontrado en línea. Cuando agrego estos archivos a un archivo zip, aparece un error:

System.ArgumentException: 'Ya se ha agregado un elemento con la misma clave.

using (Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile())
        {
            
            zip.AddFiles(list, @"\");

             
            MemoryStream output = new MemoryStream();

            zip.Save(output);
            return File(output.ToArray(), "application/zip");

        }
1
ProgrammingIsLife 22 jul. 2020 a las 00:59

2 respuestas

La mejor respuesta

Para obtener una ruta distinta por la última parte, puede usar group by la última parte y tomar el primer elemento, como el siguiente código:

List<string> distinctFiles = files
    .GroupBy(x => x.Split(new char[] { '\\' }).Last())
    .Select(x => x.First())
    .ToList();

O

List<string> distinctFiles = files
    .GroupBy(x => Path.GetFileName(x))
    .Select(x => x.First())
    .ToList();

Para prueba :

List<string> files = new List<string>
{
    @"\\UTIR\STORAGE\10-23-2015\DEPOSITS\123_DEPOSIT_10-23-2015_1.pdf",
    @"\\UTIR\STORAGE1\10-23-2015\DEPOSITS\123_DEPOSIT_10-23-2015_1.pdf",
    @"\\UTIR\STORAGE\10-23-2015\DEPOSITS\123_DEPOSIT_10-23-2015_11.pdf",
};

Tenga en cuenta que, el primero y el segundo están duplicados, en una ruta diferente

Resultado

"\\UTIR\STORAGE\10-23-2015\DEPOSITS\123_DEPOSIT_10-23-2015_1.pdf"
"\\UTIR\STORAGE\10-23-2015\DEPOSITS\123_DEPOSIT_10-23-2015_11.pdf"

Espero que encuentres esto útil.

2
Sajid 22 jul. 2020 a las 07:55

Podrías hacer esto fácilmente con LINQ.

manyPaths
  //.Select(x => x.Split(new char[] { '\\' }).Last()) // drop this
  .Select(x => x.ToLower())
  .Distinct()
  .ToList()

Esto asegurará que la lista no tenga duplicados. Si aún recibe el error, podría ser otra cosa.

EDITAR

Si necesita eliminar nombres de archivos duplicados, pero conserve la ruta completa. Perderá archivos o tendrá que cambiarles el nombre (por ejemplo, archivo.txt, 1file.txt, 2file.txt, etc.)

var fileGroups = manyPaths
        .Select(x => new { Path = x, Name = x.Split(new char[] { '\\' }).Last().ToLower() })
        .GroupBy(x => x.Name)
        .ToList();


//TODO: init your zip

foreach(var group in fileGroups)
{
    int count = 0;

    foreach(var file in group)
    {
        var newName = count > 0 ? count + group.Key : group.Key;
        //TODO: save your file to zip
        count++;
    }
}
1
Chad H 21 jul. 2020 a las 22:57