并非所有空列表都从ObservableCollection中删除?

时间:2016-11-07 09:49:13

标签: c# listview xamarin.forms

我有代码在Xamarin Forms中为ListView创建一个分组列表,由于某些原因,只有有时从列表中删除一个组(如果它是空的)。

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;

然而,这种情况发生了:

Image of listview

为什么不删除这些群组?任何解决方案?

2 个答案:

答案 0 :(得分:2)

从列表中删除时,您需要向后工作。

如:

如果您有1,2,3,4,5,6,7,8,9,10并且您说删除偶数为1-10, 1,好吧,在2,你删除它,所以3移动到它的位置..所以现在你不检查3 ...你跳到4 ...所以在这个例子中你会逃脱,但如果你的列表已经丢失说3,它会将4号移到2已经过的地方,继续前进,4将会错过

将for循环更改为递减

答案 1 :(得分:1)

如上面的BugFinder所述,您遇到的问题是在迭代时修改列表引起的。问题解决了。但是也可能值得一看整体方法。目前我们:

  1. 创建所有可能组的列表(A-Z)
  2. 通过动物列表迭代,并根据第一个字母将每个动物添加到一个组中
  3. 通过群体迭代并扔掉任何空的。
  4. 这可以通过几行Linq代码完成,并对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;  }
    
    }
    

    我们现在可以使用

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

    非常小的后记:使用下划线前缀变量名通常用于类的成员变量,而不是局部变量(_group,_animal)。它并没有改变代码的工作方式,但在与其他人共享代码时,使用一般约定有助于加快阅读和理解代码。