我有代码在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;
然而,这种情况发生了:
为什么不删除这些群组?任何解决方案?
答案 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所述,您遇到的问题是在迭代时修改列表引起的。问题解决了。但是也可能值得一看整体方法。目前我们:
这可以通过几行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)。它并没有改变代码的工作方式,但在与其他人共享代码时,使用一般约定有助于加快阅读和理解代码。