有2个ArrayList如下            ArrayList al1 = new ArrayList();
            ArrayList al2 = new ArrayList();            al1.Add("a");
            al1.Add("b");
            al1.Add("c");
            al1.Add("d");            al2.Add("a");
            al2.Add("c");
            al2.Add("zz");
            al2.Add("a");
            al2.Add("b");
            al2.Add("a");
            al2.Add("c");
现要求al1根据al2的值构建al3,当al1的值在al2中出现过2次或以上的,那么这个值就会被去掉:
如这个例子中a和c在al2中出现了2次或以上,就会被去掉,最后的结果应是 b,dal1和al2都比较大,请教该如何有效的写这个函数?

解决方案 »

  1.   

    遍历al1
    对于每个al1中的元素,如果al2中包含,则al2中remove掉这个元素,再次判断是否包含,如果包含则remove掉al1中的这个元素。或者先排序一下 然后
      

  2.   

    你的al1和al2在生成al3后还用么?不用就直接遍历al1,判断是否在al2中存在,如果大于两次,add入al3并remove掉,应该就是这思路吧
      

  3.   


                ArrayList al1 = new ArrayList() { "a", "b", "c", "d" };
                ArrayList al2 = new ArrayList() { "a", "c", "zz", "a", "b", "a", "c" };
                ArrayList rst = new ArrayList();            al2.Sort();
                int index = 0;
                foreach (var n in al1)
                {
                    index = al2.IndexOf(n);
                    if (index == -1 || index == al2.Count || al2[index + 1] != n)
                        rst.Add(n);
                }
      

  4.   

    你要是用list<string>,不用ArrayList,效率会高些
      

  5.   

    如果.net 3.5或更高,支持Linq还容易点:
    static void Main(string[] args)
    {
        ArrayList al1 = new ArrayList();
        ArrayList al2 = new ArrayList();    al1.Add("a");
        al1.Add("b");
        al1.Add("c");
        al1.Add("d");    al2.Add("a");
        al2.Add("c");
        al2.Add("zz");
        al2.Add("a");
        al2.Add("b");
        al2.Add("a");
        al2.Add("c");    var different = al2.Cast<string>().Intersect(al1.Cast<string>()).Distinct();
        var other = al2.Cast<string>().Except(different).Concat(different).OrderBy(s => s);
        other.ToList().ForEach(s => Console.WriteLine(s));
        Console.ReadKey();
    }
      

  6.   

    使用LINQ很方便的,
    同楼上代码:
    static void Main(string[] args)
    {
        ArrayList al1 = new ArrayList();
        ArrayList al2 = new ArrayList();    al1.Add("a");
        al1.Add("b");
        al1.Add("c");
        al1.Add("d");    al2.Add("a");
        al2.Add("c");
        al2.Add("zz");
        al2.Add("a");
        al2.Add("b");
        al2.Add("a");
        al2.Add("c");    var different = al2.Cast<string>().Intersect(al1.Cast<string>()).Distinct();
        var other = al2.Cast<string>().Except(different).Concat(different).OrderBy(s => s);
        other.ToList().ForEach(s => Console.WriteLine(s));
        Console.ReadKey();
    }
      

  7.   

    一句话足矣
    //lambda
                al1.Cast<string>()
                    .Where(s => al2.Cast<string>()
                        .Count(a => a == s) <= 1)
                            .ToList()
                                .ForEach(s => Console.WriteLine(s));
      

  8.   

    只有.NET 2.0 所以采用了iammac的方法,谢谢大家