C# 减少使用ListView c时的循环数#
我有一个列表视图,如下所示: 我想重复每一项,重复数量列中的每一项。我已经编写了一个代码来实现这一点:C# 减少使用ListView c时的循环数#,c#,loops,listview,iteration,C#,Loops,Listview,Iteration,我有一个列表视图,如下所示: 我想重复每一项,重复数量列中的每一项。我已经编写了一个代码来实现这一点: foreach (ListViewItem item in listView1.Items) { for (int quantity = 1; quantity < (Convert.ToInt32(item.SubItems[1].Text) + 1); quantity++) {
foreach (ListViewItem item in listView1.Items)
{
for (int quantity = 1; quantity < (Convert.ToInt32(item.SubItems[1].Text) + 1); quantity++)
{
//do something
}
}
foreach(listView1.Items中的ListViewItem项)
{
对于(整数数量=1;数量<(将.ToInt32(项.子项[1].文本)+1)转换为整数数量++)
{
//做点什么
}
}
我想知道我是否可以只用一个循环而不是两个循环
谢谢我不知道你为什么要这样做,但是如果你认为这是必要的并且有帮助的话,你可以这样做:
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);
}
但正如您在评论中提到的End可读性,我真的认为您的两个嵌套循环足够可读,或者至少比这个链接更可读。需要说明的是:这并没有减少迭代次数,只是减少了循环的嵌套
更具可读性的方法是将一些功能封装在额外的方法中:
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
}
foreach(ListViewItems中的ListViewItem项)
HandleItem(项目);
私有无效HandleItem(ListViewItem项目)
{
对于(int i=1;我认为一个循环的总迭代次数仍然是相同的…当前方法有什么问题?其他优化将取决于//做某事做什么。您期望的结果是什么?您可以使用Select()减少循环嵌套
method,它实际上会给您一个循环。但是,迭代次数不会减少,我认为不会possible@AlexK.是的,我知道,但问题是我的程序有太多循环,很难遵循。我的大多数循环依赖于ListView。我建议您使用ListView来显示一些实体。但是如果您需要计算一些东西,然后使用实体,而不是使用那些实体绑定到的UI控件。请注意,不会减少“迭代次数”它实际上只是将它变成一个命令而不是两个命令,但这个答案是正确的。循环集合的时间量没有改变。@RinkTaguar这是正确的,但OP(据我所知)不想减少迭代次数(他/她想做每一步),但要去掉嵌套循环。但我用我认为更可读的方法更新了我的答案。这可能会给OP留下这样的印象,即现在迭代次数更少,而实际上它只是linq版本。哦,我同意你的看法,我只是想让相信这种方法“更快”的人明白@再一次,问题是“一个循环而不是两个”,而不是“如何用更少的迭代实现相同的迭代次数”。我没有假装迭代次数更少,而是发布了结果,以表明迭代次数相同。
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
}