我有一个listView看起来像这样:
我想在数量列中迭代每个项目。我写了一个代码来执行此操作:
foreach (ListViewItem item in listView1.Items)
{
for (int quantity = 1; quantity < (Convert.ToInt32(item.SubItems[1].Text) + 1); quantity++)
{
//do something
}
}
我想知道我是否可以在一个循环而不是两个循环中完成此操作。
由于
答案 0 :(得分:1)
我不确定你为什么要这样做,但如果你认为这是必要的和有帮助的,你可以这样做一些linq:
var items = listView1.Items.OfType<ListViewItem>();
var query = items.SelectMany(item =>
Enumerable.Range(1, Convert.ToInt32(item.SubItems[1].Text))
.Select(i => new { Item = item, Index = i});
foreach(var element in query)
{
Console.WriteLine("Book: {0}, i: {1}", element.Item.Text, element.Index);
}
结果:
Book: book1, i: 1
Book: book1, i: 2
Book: book1, i: 3
Book: book1, i: 4
Book: book2, i: 1
...
Book: book2, i: 11
Book: book3, i: 1
...
Book: book3, i: 13
但是当你提到注释中的可读性时,我真的认为你的两个嵌套循环足够可读,或者至少比这个链接更具可读性。
需要注意的是:这不会减少迭代次数,只会减少循环的嵌套。
更易读的方法是在额外的方法中封装一些功能:
foreach(ListViewItem item in ListViewItems)
HandleItem(item);
private void HandleItem(ListViewItem item)
{
for (int i=1; i<Convert.ToInt32(item.SubItems[1].Text)+1; i++)
HandleItemWithIndex(item, i);
}
private void HandleItemWithIndex(ListViewItem item, int index)
{
// Do something
}
这种方式(如果你恰当地命名方法),很容易理解每种方法的发生和目的。