STL List Replace



  • Hallo Zusammen,

    Ich habe folgenden Container benutzt

    List<string> list = new List<string>();
    

    Ich benötige eine Funktion die mir einen Eintrag in der Liste ersetzt.
    Danke.



  • In .NET gibt es leider keine Replace-Methode im dem Sinne. Du kannst über den Index gehen.

    List<string> l = new List<string>();
    
    int index = l.IndexOf("test");                        
    
    l[index] = "test2";
    


  • Sorry für den Doppelpost.
    Du kannst dir das natürlich auch selber schreiben mit einer Extension-Methode ungefähr so:

    public static class Ext
        {
            public static void Replace<T>(this IList<T> enumerable, Func<T,bool> predicate, T valueToReplace)
            {
                if (enumerable == null)
                    throw new ArgumentNullException("enumerable");
    
                if(predicate == null)
                    throw new ArgumentNullException("predicate");
    
                if(valueToReplace == null)
                    throw new ArgumentNullException("valueToReplace");
    
                // real action is performed here
                var item = enumerable.Where(predicate).FirstOrDefault();
    
                if (item == null)
                    return;
    
                int index = enumerable.IndexOf(item);
    
                if (index < 0)
                    return;
    
                if (index >= enumerable.Count)
                    return;
    
                enumerable[index] = valueToReplace;
    
            }
        }
    
        class Program
        {
    
            static void Main(string[] args)
            {
    
                List<string> l = new List<string>() {"test","aest2","test3" };
    
                l.Replace(p => p.StartsWith("a"), "test2");
    
                l.ForEach(Console.WriteLine);
    
                Console.ReadKey();
    
            }
    
        }
    

    Wichtig hierbei ist, das wenn der Delegate natürlich mehrfach matched, nur das erste matchende Element ersetzt wird. Um ein ReplaceAll zu machen, müsste man das nochmal etwas überarbeiten.Aber das ist ja jetzt nicht Aufgabe.

    Edit: Hab aus dem IList Rückgabewert mal ein void gemacht, war kein Rückgabewert nötig.



  • Replace in der STL ersetzt doch nur ein Element durch ein anderes. Ich würde, wenn nur diese Funktionalität erwünscht ist, nicht mit Linq arbeiten, das eignet sich besser für Suchanfragen. Ich würde mit IList<T>.IndexOf die Indexposition des Elementes suchen und das Element austauschen, dann mußt Du Dich nicht zweimal durch die Collection quälen wie in der von Firefighter vorgestellten Lösung.



  • Stimmt gutes Argument. Danke für den Hinweis 😉


Anmelden zum Antworten