Search text file and compare with others

-1

I have two string lists. Received and Fixed. Well, I would like with just a lambda expression, I go through the Recebido list within the Fixo list and if there is no file within Fixo , I save those files that do not exist in Fixo to then delete them from within the Received list.

For example, I have the following files to compare:

odo_prs003a.asp
odo_gen0067b.asp
gen0001.js
estilo.css

And I have this fixed list:

odo_prs003a.asp
cmc002a.asp
cmc0067d.asp
odo_gen0067b.asp
gen0001.js
ass0000.asp
calendar-br.js
css002c.css

See that in the Fixed list I have no style.css, so this file is a potential candidate to be deleted.

How do I do this using lambda?

Comparing and not existing in the Fixed list, I save in an array or list and then I delete.

I did this and now I need to apply lambda:

private bool ComparaArquivo(string recebido, string fixo)
        {
            List<string> _recebido = new List<string>();
            List<string> _fixo = new List<string>();

            try
            {
                return true;
            }
            catch
            {
                return false;
            }            
        }
    
asked by anonymous 28.02.2016 / 18:58

2 answers

2

You can even do with LINQ, either using Query Syntax or Method Syntax (which you called lambda), for the sake of readability, I prefer Query Syntax .

var lista = new List<string> {
    "odo_prs003a.asp",
    "odo_gen0067b.asp",
    "gen0001.js",
    "estilo.css"
};

var lfixa = new List<string> {
    "odo_prs003a.asp",
    "cmc002a.asp",
    "cmc0067d.asp",
    "odo_gen0067b.asp",
    "gen0001.js",
    "ass0000.asp",
    "calendar-br.js",
    "css002c.css",
};

var delQuery = 
    from item in lista
    join fixo in lfixa on item equals fixo into ljoin
    from test in ljoin.DefaultIfEmpty()
    where test == null
    select item;

var delMethod = lista
    .GroupJoin(lfixa, item => item, fixo => fixo, (item, fixo) => new { item, fixo })
    .SelectMany(list => list.fixo.DefaultIfEmpty(), (list, fixo) => new { list.item, fixo })
    .Where(list => list.fixo == null)
    .Select(list => list.item);

var delClasico = new List<string>();        
foreach (var item in lista)
{
    if (!lfixa.Contains(item))
    {
        delClasico.Add(item);
    }           
}

foreach (var item in delQuery)
{
    Console.WriteLine(item);
}

foreach (var item in delMethod)
{
    Console.WriteLine(item);
}

foreach (var item in delClasico)
{
    Console.WriteLine(item);
}

In the above example, I search by using Query Syntax (I store the return in delQuery ), Method Syntax (I store the return in delMethod ) and using a conventional loop ).

Note that delClasico adds unnecessary complexity, Method Syntax has exactly the same cost, but does it in a more elegant way.

However, I do not see an advantage in using Query Syntax instead of a good old for loop, either by performance, readability, or some other hidden reason.

As I see you are trying to compare two file structures, I will give you an implementation ... It gets two paths, then compares all the files with the same name ... identifying all the files that only protect a structure files, and the files that belong to the two structures, but are not identical:

public class Arquivo
{
    public string Path { get; set; }
    public string Nome { get; set; }
    public string NomeCompleto { get { return this.Path + this.Nome; } }
    public byte[] Hash { get; set; }
}

.

static void CompararPastas(string origemPath, string destinoPath)
{
    var arquivosOrigem = new List<Arquivo>();
    var arquivosDestino = new List<Arquivo>();

    var pastaOrigem = new DirectoryInfo(origemPath);
    var pastaDestino = new DirectoryInfo(destinoPath);

    LerPasta(pastaOrigem, origemPath, ref arquivosOrigem);
    LerPasta(pastaDestino, destinoPath, ref arquivosDestino);

    var somenteOrigem =
        from arquivoOrigem in arquivosOrigem
        join arquivoDestino in arquivosDestino on arquivoOrigem.NomeCompleto equals arquivoDestino.NomeCompleto into notInDestino
        from arquivoDestino in notInDestino.DefaultIfEmpty()
        where arquivoDestino == null
        select arquivoOrigem;

    foreach (var arquivo in somenteOrigem)
    {
        //arquivo não presente no destino, você pode copiar o mesmo para a origem.
    }

    var somenteDestino =
        from arquivoDestino in arquivosDestino
        join arquivoOrigem in arquivosOrigem on arquivoDestino.NomeCompleto equals arquivoOrigem.NomeCompleto into notInOrigem
        from arquivoOrigem in notInOrigem.DefaultIfEmpty()
        where arquivoOrigem == null
        select arquivoDestino;

    foreach (var arquivo in somenteDestino)
    {
        //arquivo não presente na origem, você pode apagar o mesmo para o destino.
    }

    var modificados =
        from arquivoOrigem in arquivosOrigem
        join arquivoDestino in arquivosDestino on arquivoOrigem.NomeCompleto equals arquivoDestino.NomeCompleto
        where arquivoOrigem.Hash != arquivoDestino.Hash
        select arquivoOrigem;

    foreach (var arquivo in modificados)
    {
        //arquivo na origem é diferente do arquivo no destino, você pode substituir o arquivo da origem pelo destino;
    }
}

static void LerPasta(DirectoryInfo pasta, string basePath, ref List<Arquivo> arquivos)
{
    foreach (var subPasta in pasta.GetDirectories())
    {
        LerPasta(subPasta, basePath, ref arquivos);
    }

    foreach (var arquivo in pasta.GetFiles())
    {
        LerArquivo(arquivo, basePath, ref arquivos);
    }
}

static void LerArquivo(FileInfo arquivo, string basePath, ref List<Arquivo> arquivos)
{
    var file = new Arquivo();
    file.Path = arquivo.DirectoryName.Replace(basePath, string.Empty);
    file.Nome = arquivo.Name;
    using (var lobjLeitura = arquivo.OpenRead())
    {
        using (var lobjSha512 = new SHA256Managed())
        {
            file.Hash = lobjSha512.ComputeHash(lobjLeitura);
        }
    }
    arquivos.Add(file);
}
    
29.02.2016 / 17:21
2

You can use the Except method. In the following code, the variable resultado will store the records that are not present in the _fixo list. If you want the result to be the records that exist in common in both lists, you can use the Intersect method.

var resultado = _recebido.Except(_fixo);

See working at Ideone

    
01.03.2016 / 13:31