none
请教如何 高效 筛选出两个数组 共同部分 RRS feed

  • 问题

  • 有数组A  和数组B  如何用 数组B过滤数组A  分别得到 剩下的和两个数组共有的部分     谢谢

    2011年12月12日 6:49

答案

  • Intersect  应该在 08 才有吧!


    是的,属于NET FRAMEWORK3.5的扩展函数。
    如果你需要2.0的版本的,为了提高效率,建议使用我这个方法:

    namespace A
    {
        class Program
        {
            /// <summary>
            /// 求a中有但是b中没有;以及共有的函数
            /// </summary>
            /// <returns></returns>
            static List<List<int>> GetCommonAndDifferences(int[]a,int[]b)
            {
                //不同部分
                List<int> difference = new List<int>();

                //拷贝a和b数组副本
                List<int> temp = new List<int>(a);
                List<int> temp2 = new List<int>(b);

                for (int i = 0i < temp.Counti++)
                {
                    int index = temp2.IndexOf(temp[i]);

                    //如果b中没有找到a的元素,说明只有a存在
                    if (index == -1)
                    {
                        difference.Add(temp[i]);

                        //移除a中的这个元素,剩下的a应该和b是一样的
                        temp.Remove(temp[i]);
                        --i;
                    }
                }

                
     List<List<int>> r = new List<List<int>>();
                r.Add(difference);
                r.Add(temp);
                return r;
               
            }
            static void Main(string[] args)
            {
                int[] a = { 1,2,3,4,5};
                int[] b = { 2,3,7,8,9};

                List<List<int>> results = GetCommonAndDifferences(ab);

                //相同
                foreach (var item in results[1])
                {
                    Console.Write(item+"  ");
                }
                Console.WriteLine();
                
                //不同
                foreach (var item in results[0])
                {
                     Console.Write(item+"  ");
                }
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2011年12月13日 1:57
    版主

全部回复

  • Join. 请参考 Join 扩展方法。对于数组没有特别高效的,就是循环两次分别比较而已。
    Mark Zhou
    2011年12月12日 7:11
  • 有数组A  和数组B  如何用 数组B过滤数组A  分别得到 剩下的和两个数组共有的部分     谢谢


    namespace A
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] a = { 1,2,3,4,5};
                int[] b = { 2,3,7,8,9};

                //共有部分:
                Console.WriteLine("共有部分:");
                foreach (var item in a.Intersect(b))
                {
                    Console.Write(item+" ");
                }

                
                //A剩下部分:
                Console.WriteLine("\nA剩下部分:");
                foreach (var item in a.Except(b))
                {
                    Console.Write(item+" ");
                }
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月12日 8:47
    版主
  • 请问这种方法的效率 怎么样,如果 数组长度很长会不会要很长时间!
    2011年12月13日 1:33
  • 请问这种方法的效率 怎么样,如果 数组长度很长会不会要很长时间!

    你可以试试看,不过我想因为是扩展方法,微软应该使用最佳的比较方法筛选的。
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年12月13日 1:34
    版主
  • Intersect  应该在 08 才有吧!

    2011年12月13日 1:42
  • Intersect  应该在 08 才有吧!


    是的,属于NET FRAMEWORK3.5的扩展函数。
    如果你需要2.0的版本的,为了提高效率,建议使用我这个方法:

    namespace A
    {
        class Program
        {
            /// <summary>
            /// 求a中有但是b中没有;以及共有的函数
            /// </summary>
            /// <returns></returns>
            static List<List<int>> GetCommonAndDifferences(int[]a,int[]b)
            {
                //不同部分
                List<int> difference = new List<int>();

                //拷贝a和b数组副本
                List<int> temp = new List<int>(a);
                List<int> temp2 = new List<int>(b);

                for (int i = 0i < temp.Counti++)
                {
                    int index = temp2.IndexOf(temp[i]);

                    //如果b中没有找到a的元素,说明只有a存在
                    if (index == -1)
                    {
                        difference.Add(temp[i]);

                        //移除a中的这个元素,剩下的a应该和b是一样的
                        temp.Remove(temp[i]);
                        --i;
                    }
                }

                
     List<List<int>> r = new List<List<int>>();
                r.Add(difference);
                r.Add(temp);
                return r;
               
            }
            static void Main(string[] args)
            {
                int[] a = { 1,2,3,4,5};
                int[] b = { 2,3,7,8,9};

                List<List<int>> results = GetCommonAndDifferences(ab);

                //相同
                foreach (var item in results[1])
                {
                    Console.Write(item+"  ");
                }
                Console.WriteLine();
                
                //不同
                foreach (var item in results[0])
                {
                     Console.Write(item+"  ");
                }
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2011年12月13日 1:57
    版主