2016-11-07 1 views
0

Ich habe Code zum Erstellen einer gruppierten Liste für eine ListView in Xamarin Forms, die aus irgendeinem Grund nur manchmal entfernt eine Gruppe aus der Liste, wenn es leer ist.Nicht alle leeren Listen werden aus ObservableCollection entfernt?

char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); 
var animals = new List<string>() { "Jaguar", "Elephant", "Nemo", "Cat", "Dog", "Iguana", "Puma", "Crow", "Hawk", "Owl", "Badger", "Meerkat", "Lion", "Tiger", "Rabbit", "Pig" }; 

var groups = new ObservableCollection<GroupedItemModel>(); 

for (int i = 0; i < alpha.Length; i++) 
{ 
    groups.Add(new GroupedItemModel(alpha[i].ToString())); 
} 

foreach (var _group in groups) 
{ 
    foreach (var _animal in animals) 
    { 
     if (_animal[0].ToString().ToUpper() == _group.GroupName.ToUpper()) 
     { 
      _group.Add(_animal); 
     } 
    } 
} 

for (int i = 0; i < groups.Count; i++) 
{ 
    if (groups[i].Count == 0) 
    { 
     groups.RemoveAt(i); 
    } 
} 

ListSource = groups; 

Dies geschieht jedoch:

Image of listview

Warum diese Gruppen nicht entfernt werden? Irgendwelche Lösungen?

+0

Sie sind sicher, dass Sie eine leere Liste nicht initialisieren. Vielleicht entfernt es Nullen, aber keine leeren Listen. Nur eine Vermutung. – Emad

+1

Wenn Sie eine Sammlung ändern, während Sie sie durchlaufen, funktioniert das normalerweise nicht so, wie Sie es erwarten. Ein besserer Ansatz wäre, einmal zu iterieren und eine neue Liste der zu entfernenden Elemente zu erstellen. Nachdem Sie die Iteration abgeschlossen haben, löschen Sie alle Elemente auf einmal – Jason

Antwort

2

Beim Entfernen von einer Liste müssen Sie rückwärts arbeiten.

wie:

wenn Sie 1,2,3,4,5,6,7,8,9,10 haben, und Sie sagen, entfernen gerade Zahlen als 1-10, auf 1, das ist ok Bei 2 entfernst du es, also verschiebt sich 3 an seinen Platz .. also wirst du nicht 3 überprüfen ... du sprichst zu 4 .. in diesem Beispiel würdest du damit durchkommen, aber was wäre, wenn deine Liste bereits fehlte sagen 3, wäre es Nummer 4 an den Ort bewegt haben, wo 2 gewesen war, und weitermachen, würde 4

ändern for-Schleife absteigend sein

1

Wie oben durch BugFinder beschrieben verpasst werden, das Problem, das Sie bekommen ist caus Ändern Sie die Liste, während Sie sie durchlaufen. Problem gelöst. Es könnte sich aber auch lohnen, den Gesamtansatz zu betrachten. Derzeit wir:

  1. erstellen Liste aller möglichen Gruppen (AZ)
  2. Iterate obwohl die Liste der Tiere und die jeweils auf dem ersten Buchstaben
  3. Iterate obwohl die Gruppen auf der Basis einer Gruppe hinzufügen und jede wegzuwerfen die sind leer.

Dies alles kann mit ein paar Zeilen von Linq-Code und einer zwicken zum Wir GroupedItemModel

public class GroupedItemModel 
{ 
    public GroupedItemModel(string name, IEnumerable<string> values){ 
     Name = name; 
     Values = new List<string>(values); 
    } 

    public string Name { get; } 
    public List<string> Values { get; } 

} 

getan werden jetzt eine ObservableCollection<GroupedItem> mit

new ObservableCollection<GroupedItem>(animals.GroupBy(a => char.ToUpper(a[0]).ToString()).OrderBy(g => g.Key).Select(g => new GroupedItem(g.Key, g))); 

Sehr gering Nachwort versehen können: Voranstellen Variablennamen mit Unterstrichen werden normalerweise für Membervariablen einer Klasse verwendet, nicht für lokale Variablen (_group, _animal). Es ändert nicht die Funktionsweise des Codes, aber wenn Sie Code mit anderen teilen, hilft Ihnen die Verwendung der allgemeinen Konventionen, den Code schneller zu lesen und zu verstehen.

Verwandte Themen