Bewegen Element an Ende der Liste mit Liste.Bewegen

Habe ich eine Liste der Elemente und eine der „ausgewählt“ Liste (ein Teil der vollständigen Liste). Ich möchte implementieren Sie eine Funktion, bewegt sich die sub-Elemente der Liste unten die vollständige Liste.

Wenn ich zum Beispiel nur ausgewählte Elemente 2,4, & 6 aus der Liste 0,1,2,3,4,5,6,7,8,9 ich will diese Funktion, um das Ergebnis 0,1,3,5,7,8,9,2,4,6

Derzeit bin ich versuchen, so etwas wie dieses, aber ich bin mir nicht sicher, wie Sie Sie definieren moveTo:

public object MoveLoopToBottom()
{
    if (selectedLoops.Count < 1)
        return null;

    foreach (ProfilerLoop selected in selectedLoops)
    {
        int moveFrom = ClonedLoops.IndexOf(selected);
        int moveTo = ;

        ClonedLoops.Move(moveFrom, moveTo);
    }

    return null;
}

Ich konsultiert diese, wie List.Move funktioniert: Generische Liste – verschieben der Elemente innerhalb der Liste aber es scheint, dass es nicht „ans Ende der Liste“. List.Move können (bei den meisten) zu bewegen, um die „second-to-last“ – position (versuchen Sie zum Ende der Liste wirft „OutOfRange-Exception“).

Statt List.Move ich habe versucht zu tun List.Remove dann List.Add (oder List.Add dann List.RemoveAt) aber ruft List.Remove gibt mir Probleme mit meiner foreach-Schleife Iterationen (wo List.Move nicht).

Irgendwelche Vorschläge?

  • Erstellen Sie eine neue Liste der ausgewählten Elemente, entfernen Sie jene aus der ursprünglichen Liste, dann fügen Sie an das Ende, so etwas wie var newList = originalList.Except(selectedItems).AddRange(selectedItems);
  • hinzufügen ToList() nach Except (als AddRange Methode vorhanden ist, auf eine List<T> und nicht auf IEnumerable<T>).
  • Was list = list.OrderBy(i => selectedList.IndexOf(i)).ToList();? Würde, dass alles, was nicht in selectedList ersten weil IndexOf wäre -1 dann ist alles in Ordnung, es wird in selectedList.
  • Ist ClonedLoops eine generische Liste? Das ist List<T>?
InformationsquelleAutor derekantrican | 2016-06-08



2 Replies
  1. 4

    Wenn ich dieses Verständnis richtig, dann können Sie einfach entfernen und readd Sie ohne Verwendung einer Schleife.

    List<int> list = new List<int>(new int[] { 0,1,2,3,4,5,6,7,8,9 });
    var selected  = new List<int>(new int[] { 0,1,2 });
    
    list = list.Except(selected).ToList();
    list.AddRange(selected);

    Dies entfernt die ausgewählten Elemente aus der Liste, dann wieder fügen Sie Sie nach unten.

    DotNetFiddle

  2. 0

    Tatsächlich, das funktionierte für mich (ich bin nicht sicher, warum es nicht funktionierte vorher). @prospector ’s Antwort ist wohl auch ganz gültig (nur nicht für meine einzigartige situation)

    public object MoveLoopToBottom()
    {
        if (selectedLoops.Count < 1)
            return null;
    
        foreach (ProfilerLoop selected in selectedLoops)
        {
            int moveFrom = PartLoops.IndexOf(selected);
    
            ClonedLoops.Move(moveFrom, PartLoops.Count - 1);
        }
    
        return null;
    }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.