求一个遍历算法的替代方案

FocusNT 2013-09-11 09:48:10
遍历算法中我希望实现当index1,index2,index3,index4,index5中不等于0时才有下面对应的for循环,如果等于0的话就不循环这个for循环,不知道有没有什么解决方案?或者说有没有替代的方法


int index1=3;
int index2=3;
int index3=2;
int index4=4;
int index5=4

int totalStep = 500

for (int i1 = 0; i1 < index1;i1++ )
{
for (int i2 = 0; i2 < index2; i2++)
{
for (int i3 = 0; i3 < index3; i3++)
{
for (int i4 = 0; i4 < index4; i4++)
{
for (int i5 = 0; i5 < index5; i5++)
{
for (int time = 0; time < totalStep; time++)
{
//dosomething
}
}
}
}
}
}
...全文
446 点赞 收藏 25
写回复
25 条回复
FocusNT 2013年09月26日
谢谢,第一碰到你说的编译器问题,我看了下,就多了一个ToList
回复 点赞
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ForAndFor
{
    class Program
    {
        static void Main(string[] args)
        {
            int[][] data = new int[][] 
            { 
                new int[] { 1, 2, 3 },
                new int[] { 4, 5 },
                new int[] { 7, 8 },
                new int[] { 9 }
            };
            var query = data[0].Select(x => new int[] { x }).ToList();
            foreach (var item in data.Skip(1))
            {
                query = query.SelectMany(x => item.Select(y => x.Concat(new int[] { y }).ToArray())).ToList();
            }
            foreach (var item in query)
            {
                Console.WriteLine(string.Join(", ", item));
            }
        }
    }
}
不好意思,之前用的VS2012,编译器修改了。 在VS2010上使用上面的代码。
回复 点赞
tcmakebest 2013年09月12日
引用 2 楼 FocusNT 的回复:
假如我index1=0了,其它的没有等于0,其它几个for循环还是要走的,关键在这里,想不出怎么解决了
循环条件调整一下就好: for (int i1 = 0; i1 < index1 or i1 == 0;i1++ )
回复 点赞
FocusNT 2013年09月11日
非常感谢caozhy,这个就是我想要的,但是我发现http://bbs.csdn.net/topics/390572575这个里面你最后回复的代码生成结果好像不对额?
回复 点赞
http://bbs.csdn.net/topics/390572575
回复 点赞
FocusNT 2013年09月11日
先谢谢各位了,我用递归再试试
回复 点赞
phommy 2013年09月11日
试试不从0开始循环,而是从1开始?
回复 点赞
FocusNT 2013年09月11日
我不是说3L用了递归, 我需要根据条件来确定有几个循环。这几个循环没有上下层级关系的,如果index1不满足那就是其它4个循环了,如果index2和4不满足那就是循环1,3,5了
回复 点赞
dota_sky_god 2013年09月11日
引用 4 楼 FocusNT 的回复:
楼上可能理解错我的意思了。 关键是最后dosomething这里要做的事情导致我用递归也有点不好写,所以想到动态for循环的方式
3L并没有递归啊,只不过给出一个前置的判断,先判断完然后再进行你那个FOR循环
回复 点赞
FocusNT 2013年09月11日
楼上可能理解错我的意思了。 关键是最后dosomething这里要做的事情导致我用递归也有点不好写,所以想到动态for循环的方式
回复 点赞
人生导师 2013年09月11日
引用 2 楼 FocusNT 的回复:
假如我index1=0了,其它的没有等于0,其它几个for循环还是要走的,关键在这里,想不出怎么解决了
你在进行下面for循环的时候先添加一个判断就好了,如

if(index1==0||index2==0||index3==0||index4==0||index5==0)
{
return;
}
else
{
// 你的循环代码

}
回复 点赞
FocusNT 2013年09月11日
假如我index1=0了,其它的没有等于0,其它几个for循环还是要走的,关键在这里,想不出怎么解决了
回复 点赞
tcmakebest 2013年09月11日
等于0时条件不成立当然不循环,上述代码可以用,为何要替换?
回复 点赞
zaz770977934 2013年09月11日
引用 4 楼 FocusNT 的回复:
楼上可能理解错我的意思了。 关键是最后dosomething这里要做的事情导致我用递归也有点不好写,所以想到动态for循环的方式
比较笨的方法判断index1=0的时候就把index1=1~~不知道可以不?
回复 点赞
as862214582 2013年09月11日
想不出来 帮你顶一下吧
回复 点赞
FocusNT 2013年09月11日
在进入第二次循环的时候query数据变了
回复 点赞
FocusNT 2013年09月11日
就你那个拷贝过来的
回复 点赞
FocusNT 2013年09月11日

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ForAndFor
{
    class Program
    {
        static void Main(string[] args)
        {
            int[][] data = new int[][] 
            { 
                new int[] { 1, 2, 3 },
                new int[] { 4, 5 },
                new int[] { 7, 8 },
                new int[] { 9 }
            };
            var query = data[0].Select(x => new int[] { x });
            foreach (var item in data.Skip(1))
            {
                query = query.SelectMany(x => item.Select(y => x.Concat(new int[] { y }).ToArray()));
            }
            foreach (var item in query)
            {
                Console.WriteLine(string.Join(", ", item));
            }
        }
    }
}
回复 点赞
你把你的代码贴出来,我拿VS中看看。
回复 点赞
FocusNT 2013年09月11日
一模一样的复制过来的
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告