黑马程序员技术交流社区

标题: 请教一个问题 [打印本页]

作者: 邓连超    时间: 2012-11-21 22:25
标题: 请教一个问题
本帖最后由 邓连超 于 2012-11-22 14:06 编辑

static void Main(string[] args)
        {

            string[] strs1 = { "a", "b", "c", "d", "e" };
            string[] strs2 = { "d", "e", "f", "g", "h" };

            ArrayList list1 = new ArrayList();
            ArrayList list2 = new ArrayList();

            list1.AddRange(strs1);
            list2.AddRange(strs2);

            for (int i = 0; i < list2.Count; i++)
            {
                if (!list1.Contains(list2))
                {
                    list1.Add(list2);
                }
                Console.WriteLine(list1);
            }

            Console.ReadKey();
        }



应该输出abcdefg的啊,怎么不对呢?

作者: 许庭洲    时间: 2012-11-22 07:46
list1.Add(list2[i]); //加的是对string[]的引用,而你list1 值new了一次,只有一个对象,而list1加了5次对同一个list1 的引用,
作者: 崔晓聪    时间: 2012-11-22 09:54
补充下上楼,所以呢你可以这样解决:
  1.   static void Main(string[] args)
  2.         {

  3.             string[] strs1 = { "a", "b", "c", "d", "e" };
  4.             string[] strs2 = { "d", "e", "f", "g", "h" };

  5.             ArrayList list1 = new ArrayList();
  6.            // ArrayList list2 = new ArrayList();

  7.             list1.AddRange(strs1);
  8.             list1.AddRange(strs2);

  9.             for (int i = 0; i < list1.Count; i++)
  10.             {
  11.                 if (!list1.Contains(list1[i]))
  12.                 {
  13.                     list1.Add(list1[i]);
  14.                 }
  15.                 Console.WriteLine(list1[i]);
  16.             }

  17.             Console.ReadKey();
  18.         }
复制代码

作者: 欧玉斌    时间: 2012-11-22 11:29
崔晓聪 发表于 2012-11-22 09:54
补充下上楼,所以呢你可以这样解决:

晓聪提供了去除list2,只用list1的方法。其实也可以保留list2.
你没有得到相应的结果,不是出在list1的赋值上,通过在list1.Add(list2);断点,你可以发现,
list1确实有8个值:abcdefgh.但为什么只输出abcde呢?
原因很简单,for循环里截至条件i<list2.Count,而list2.Count的值是5,
所以Console.WriteLine(list1);只能输出list1的前五项。
当然,你也不能直接把list1.count改成list2.count.应该在for循环外,再遍历输出list1.
  1. foreach (string item in list1)
  2.    {
  3.      Console.WriteLine(item);
  4.     }
复制代码
就可以得到相应结果

作者: 崔晓聪    时间: 2012-11-22 11:31
欧玉斌 发表于 2012-11-22 11:29
晓聪提供了去除list2,只用list1的方法。其实也可以保留list2.
你没有得到相应的结果,不是出在list1的赋 ...

哈哈,不错!!
作者: 邓连超    时间: 2012-11-22 13:46
谢谢楼上各位热心解答~在这寒冷的冬季,心里流过一股暖流...(此处省略好多个字....)
继续努力去!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2