A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

通过循环找出下面字符串“fjasdfefvadsjfioefjdsaijefesdfaee”中E字符的位置并输出。
        static void Main(string[] args)
        {
            //定义字符串
            string mm = "fjasdfefvadsjfioefjdsaijefesdfaee";
            //遍历
           for (int i = 0; i < mm.Length; i++)
                        {
                char ii =Convert.ToChar(mm.Substring(i, i + 1));
                if (ii=='e')
                {
                    Console.WriteLine(mm.IndexOf('e'));
                }
                        }
            Console.ReadKey();
        }


输出的时候值有一个索引6 怎么让他向后面执行。并且输出索引?

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

12 个回复

倒序浏览
本帖最后由 许庭洲 于 2012-8-27 13:30 编辑

static void Main(string[] args)
{
         //定义字符串
         string mm = "fjasdfefvadsjfioefjdsaijefesdfaee";
         char[] str = mm.toCharArray();
         for (int i = 0; i < str.Length; i++)//遍历
         {
                if (str [i ]==' e' )
                {
                       Console.WriteLine("在字符串的第{0}位置出现E",i);
                }
         }
             Console.ReadKey();
  }

点评

谢谢!这个方法可以  发表于 2012-8-27 14:24
回复 使用道具 举报
许庭洲 发表于 2012-8-27 13:19
static void Main(string[] args)
{
         //定义字符串

为什么都用这个ToCharArray呢?能用其他的方法吗?
回复 使用道具 举报
static void Main(string[] args)
        {
            //定义字符串
            string mm = "fjasdfefvadsjfioefjdsaijefesdfaee";
            //遍历
           for (int i = 0; i < mm.Length; i++)
                        {
                    //char ii=mm[i];
                char ii =Convert.ToChar(mm.Substring(i, 1));
                if (ii=='e')
                {
                    Console.WriteLine(i);
                }
                        }
            Console.ReadKey();
        }

问题已解决!!谢谢!
回复 使用道具 举报
本帖最后由 杨正 于 2012-8-27 15:08 编辑



我把你的code测试了一下,抛出了异常。
有两个地方需要更正,我已经做了标记。
结果是:


我觉得你的这种做法过于复杂,这里提供几种简单的供你参考:
//方法一:
            //定义已知字符串
            string str = "fjasdfefvadsjfioefjdsaijefesdfaee";
            //遍历字符串,当i=-1的时候,即字符串中找不到e字母了返回-1,循环结束
            for (int i = str.IndexOf('e'), j = 1; i != -1; i = str.IndexOf('e', i + 1), j++)
            {
                Console.WriteLine("第{0}个e字母的下标是{1}", j, i);
            }
            Console.ReadKey();

            //方法二:
            //定义已知字符串
            string str = "fjasdfefvadsjfioefjdsaijefesdfaee";
            //遍历字符串,把字符串中得字符逐一取出来和e字母对比
            for (int i = 0, j = 1; i < str.Length; i++)
            {
                if (str
== 'e')
                {
                    Console.WriteLine("第{0}个e字母的下标是{1}", j, i);
                    j++;
                }
            }
            Console.ReadKey();
希望可以帮到你!
回复 使用道具 举报
王杨武 发表于 2012-8-27 14:20
为什么都用这个ToCharArray呢?能用其他的方法吗?

其实这个题完全不需要str.ToCharArray,因为字符串遍历出来得每一个元素就是字符,字符串本身就是字符数组,只是他是只读的。
回复 使用道具 举报
杨正 发表于 2012-8-27 15:02
我把你的code测试了一下,抛出了异常。
有两个地方需要更正,我已经做了标记。
结果是:

非常感谢您的回答!这两个地方我已经纠正并修改。看了一下你给我的方法很好。但是第一个方法对于刚入门的新手可读性不是很高。我采用了第二种方法。谢谢!
回复 使用道具 举报
//LastIndexOf(),返回指定字符最后一次出现的位置
for (int i = 0; i <= str.LastIndexOf('e'); i++)
{
      i = str.IndexOf('e', i);//每次循环进来都是从出现e的位置加1的字符开始
    Console.WriteLine(i);
}

评分

参与人数 1黑马币 +4 收起 理由
杨正 + 4 赞一个!

查看全部评分

回复 使用道具 举报
杨正 中级黑马 2012-8-28 14:36:47
9#
lyl0043 发表于 2012-8-27 20:42
//LastIndexOf(),返回指定字符最后一次出现的位置
for (int i = 0; i

这个方法也很好啊
回复 使用道具 举报
杨正 发表于 2012-8-28 14:36
这个方法也很好啊

呵呵 有点小弯儿:D
回复 使用道具 举报
从效率上考虑  tochararray()  还是效率高,因为每次的Substring() 都会产生新的char对象,   着会引起GC,只不过代码太少 不明显,
个人认为使用lamda  比较高效
string mm = "fjasdfefvadsjfioefjdsaijefesdfaee";
char[]  ch=mm.ToCharArray();
var e =from item in ch
          where item =='e'
          select indexof(item)
foreach(var i in e)
{
  console.writeline(i)
}
回复 使用道具 举报
本帖最后由 杨正 于 2012-8-29 11:25 编辑
刘逍遥 发表于 2012-8-28 15:06
从效率上考虑  tochararray()  还是效率高,因为每次的Substring() 都会产生新的char对象,   着会引起GC, ...


有网友测试,相同情况下for循环比foreach循环效率要高。你说ToCharArray效率高,看一下源代码就知道了。
当然,你这种方法也很不错,至于效率高低,在如今的硬件时代,已不太计较。
回复 使用道具 举报
学习了  顶一个  效率问题!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马