Come trovare le stringhe duplicate

1

Permetto al mio utente di creare profili, il che significa che potrebbero potenzialmente crearne alcuni con nomi duplicati. Questo può essere problematico quindi voglio impedirgli di farlo. Ho codificato questo algoritmo ricorsivo di primo passaggio per rilevare quale numero di copie dovrei assegnare a Name , tuttavia sono quasi certo che c'è un modo migliore per scriverlo, ma il blocco dei miei scrittori mi ha fatto cadere il martello - In effetti, non ero nemmeno sicuro di come pronunciare la domanda o Google qualcosa che potrebbe già esistere. Ecco il codice:

//Check to see if there is another profile with the same name
var exiProf = profiles.FirstOrDefault(p => p.Name == newProf.Name);
int counter = 1;
while (exiProf != null)
{
    // Only match with the last number surrounded with parens
    Regex exp = new Regex(@"\((\d)\)$");
    Match ma = exp.Match(exiProf.Name);
    if(ma.Success)
    {
        num = int.Parse(ma.Groups[1].Value);
        var numChar = (counter).ToString();
        var nextNumChar = ( ++counter).ToString();
        newProf.Name = newProf.Name.Replace(numChar, nextNumChar);

        //Loop to make sure new name doesn't already exist
        exiProf = profiles.FirstOrDefault(p => p.Name == newProf.Name);
    }
    else
    {
        newProf.Name += " (" + num + ")";

        //Loop to make sure new name doesn't already exist
        exiProf = profiles.FirstOrDefault(p => p.Name == newProf.Name);
    }
}

profiles.Add(newProf);

Se cerco di aggiungere "New", "New", "New", "New" in questo ordine, "Nuovo (1)", "Nuovo (2)", "Nuovo (3)", "Nuovo (4)" è ciò che appare nel mio lista.

Nota: ho codificato algoritmi qui perché sono in grado di trasformare lo pseudocodice in C #.

    
posta Kcvin 11.11.2014 - 01:14
fonte

1 risposta

1

Penserei che questo lo farà:

if (profiles.Any(p => p.Name == newProf.Name))
{
    string template = newProf.Name + " ({0})";
    int counter = 1;
    string candidate = String.Format(template, counter);

    while (profiles.Any(p => p.Name == candidate))
    {
        counter++;
        candidate = String.Format(template, counter);
    }

    newProf.Name = candidate;
}
    
risposta data 11.11.2014 - 03:12
fonte

Leggi altre domande sui tag