首页 新闻 会员 周边 捐助

很简单的取数组的问题

1
悬赏园豆:20 [已解决问题] 解决于 2015-04-21 16:31

string strS = "xml/table/tgroup/tbody/d/dsda/a/da/sd/asd/asd/ad/a";

如何按照每次取number 数量的 '/'  ,并将其放入一个list<string>

例如,number = 2

那么 list<string>[0] = "xml/table/"

   list<string>[1] = "tgroup/tbody/"

代码小兵的成长的主页 代码小兵的成长 | 菜鸟二级 | 园豆:303
提问于:2015-04-21 14:31
< >
分享
最佳答案
0
string strS = "xml/table/tgroup/tbody/d/dsda/a/da/sd/asd/asd/ad/a";

            int number = 10;
            int count = 0, startIdx = 0;
            var list = new List<string>();
            for (int i = 0; i < strS.Length; i++)
            {
                if (strS[i] == '/')
                {
                    //当count = number-1时,加上当前次,就刚好是number数量的'/'
                    if (count == number - 1)
                    {
                        list.Add(strS.Substring(startIdx, (i + 1) - startIdx));
                        startIdx = i + 1;
                        count = 0;
                    }
                }
            }
收获园豆:15
幻天芒 | 高人七级 |园豆:37207 | 2015-04-21 14:48

我知道您老是真正的大神,但是,结果不对啊啊啊啊 啊啊啊啊啊 啊啊啊,而且,一个个的判断会不会太慢了

代码小兵的成长 | 园豆:303 (菜鸟二级) | 2015-04-21 14:55

@代码小兵的成长: 抱歉,贴代码的时候,删错了:

string strS = "xml/table/tgroup/tbody/d/dsda/a/da/sd/asd/asd/ad/a";

int number = 2;
int count = 0, startIdx = 0;
var list = new List<string>();
for (int i = 0; i < strS.Length; i++)
{
    if (strS[i] == '/')
    {
        count += 1;
        //当count = number-1时,加上当前次,就刚好是number数量的'/'
        if (count == number)
        {
            list.Add(strS.Substring(startIdx, (i + 1) - startIdx));
            startIdx = i + 1;
            count = 0;
        }
    }
}
幻天芒 | 园豆:37207 (高人七级) | 2015-04-21 15:02

@幻天芒: 多谢大神你了,不过,我的数据很长的,达到几千条,这样判断我害怕慢啊

代码小兵的成长 | 园豆:303 (菜鸟二级) | 2015-04-21 15:05

@代码小兵的成长: 你可以试试效率哇。

幻天芒 | 园豆:37207 (高人七级) | 2015-04-21 15:06

@幻天芒: 你信不信我老大看见我这样写会抽死我,哈哈,我就告诉他是大神你写的,您老再博客园的排名太高了

代码小兵的成长 | 园豆:303 (菜鸟二级) | 2015-04-21 15:10

@代码小兵的成长: 难道非得用正则才算高大上么?

幻天芒 | 园豆:37207 (高人七级) | 2015-04-21 15:13

@代码小兵的成长: 没有生气哈。。直接遍历str的写法,在我电脑上。1000000次耗时500毫秒,lambda的写法,耗时在2000毫秒左右。

幻天芒 | 园豆:37207 (高人七级) | 2015-04-21 15:24

@幻天芒: 恩恩,多谢大神了,我用你的

代码小兵的成长 | 园豆:303 (菜鸟二级) | 2015-04-21 15:46

@代码小兵的成长: 代码还可以优化,不过我想效率应该不是问题。

幻天芒 | 园豆:37207 (高人七级) | 2015-04-21 15:54
其他回答(2)
0
            string strS = "xml/table/tgroup/tbody/d/dsda/a/da/sd/asd/asd/ad/a";
            string[] arr = strS.Split('/');
            List<string> list = new List<string>();

            //因为最后一个没有'/',所以我这里取length-1
            for (int i = 0, len = arr.Length-1; i < len; i++)
            {
                list.Add(string.Join("/", arr.Take(i + 1))+"/");
            }
收获园豆:5
上位者的怜悯 | 园豆:172 (初学一级) | 2015-04-21 15:04

哥,我能告诉你,我这个strS就是一个个拼接出来的,当然不能为了分组再分开了,不过多谢您老了,让你这么麻烦

支持(0) 反对(0) 代码小兵的成长 | 园豆:303 (菜鸟二级) | 2015-04-21 15:08

而且,您老这个方法错的离谱,哈哈

支持(0) 反对(0) 代码小兵的成长 | 园豆:303 (菜鸟二级) | 2015-04-21 15:09

@代码小兵的成长: 这个代码改改你就可以用了,可以把两种方法比比效率。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2015-04-21 15:12

@幻天芒: 可是我不愿意用split()啊,您老那个看着又太直白,我不是说要高大上,但是不能一个个的试啊,您老别生气,我就是想再好点而已,我自己早就想到了一个更复杂更费脑子的方法了,只不过我自己都有点看不懂,写的不是人看的

支持(0) 反对(0) 代码小兵的成长 | 园豆:303 (菜鸟二级) | 2015-04-21 15:17

@代码小兵的成长: 呵呵,是的,我确实没有理解题意。没看明白题目就回答了,不好意思。

支持(0) 反对(0) 上位者的怜悯 | 园豆:172 (初学一级) | 2015-04-21 15:17

@代码小兵的成长: 

string strS = "xml/table/tgroup/tbody/d/dsda/a/da/sd/asd/asd/ad/a";
int number = 2;
string[] arr = strS.Split('/');
List<string> list = new List<string>();

//因为最后一个没有'/',所以我这里取length-1
for (int i = 0, len = arr.Length/2; i < len; i++)
{
    list.Add(string.Join("/", arr.Skip(i * number).Take(number)) + "/");
}

Linq+lambda的写法。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2015-04-21 15:21
0

完全不会有性能优化...每次修改string时都有产生一个新的string对象.因为string是不可变的.....

基于这个原则.你把数组和起来去循环跟把他全分开来.不会有什么影响的.

这种级别的性能问题.不是需要考虑的.

吴瑞祥 | 园豆:29449 (高人七级) | 2015-04-21 16:32

我也知道这种小细节不需要考虑,但是总得为了好习惯考虑一些,不过你刚刚说的那个道理我知道,但是你不说我还真想不起来会这样理解,多谢您老了

支持(0) 反对(0) 代码小兵的成长 | 园豆:303 (菜鸟二级) | 2015-04-21 21:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册