当前位置:编程学习 > C#/ASP.NET >>

C# 两个字符串数组互相对比 怎样优化??

两个数组一般会有几W到十几W的数据。
string strNO = this.txtNo.Text.Replace("\r\n",",");
string strTest = this.txtTest.Text.Replace("\r\n",",");
StringBuilder sbResult = new StringBuilder();
foreach(string _NO in strNO.Split(','))
{
string NO = _NO.Trim();
if(NO != "")
{
foreach(string _Test in strTest.Split(','))
{
string Test = _Test.Trim();
if(Test != "")
{
if(NO == Test)
{
sbResult.Append(Test + "\r\n"); 
break;
}
}
}
}
}
--------------------编程问答-------------------- 想实现什么效果。字符串比较不要split,会产生很多的字符串。效率很低。 --------------------编程问答-------------------- 楼主为什么非要split之后在比较 --------------------编程问答-------------------- 补充一下楼上的,不要试图“修改”字符串,任何试图“修改”字符串的做法都会产生新的串,开销大量堆栈资源。

--------------------编程问答-------------------- 唉……算法功力不深,看了蛮久,没想出什么优化方案,帮楼主顶了,坐等牛人指教 --------------------编程问答-------------------- 本人鲁钝,没想到啥方法能比split开销更低的数据源初始化方法,只能在后续的比较过程中优化了

先把两个字符串分割成List<string>;
再将两个List<string>分别进行排序,用sort方法;

这样一来,由于两个List都是经过排序的,就能应用算法,进行更快速的进行匹配了。

就是不知道sort的成本怎么样,建议楼主试一下 --------------------编程问答-------------------- 判断长度用.length是否大于0 --------------------编程问答-------------------- 先谢谢各位兄弟了!
这两个字符串就是要把内容相同的过滤出来,剩下的做其它处理。
--------------------编程问答-------------------- 这个要看你如何匹配了。比如
AA,BB,CC,DD,EE,FF和AA,CC,DD,EE,FF
需要跳过一个 BB继续匹配,还是顺序错误都算不匹配?不知道你的规则。 --------------------编程问答-------------------- 看看是否能用正则`~ --------------------编程问答-------------------- 正则性能好吗?比较差吧

就像我在5楼中说的,先排序,然后二分查找法 --------------------编程问答-------------------- 看看是怎样的比较,之后设计个数据结构作高速索引和比较 --------------------编程问答-------------------- 用归并排序方法,应该是效率比较高的一种算法了。

        private void btnChargeSet_Click(object sender, EventArgs e)
        {
            List<string> root=new List<string>();
            root.Add("10072714211596876194");
            root.Add("10072714211596872927");
            root.Add("10072714211596879733");
            root.Add("abc");
            root.Add("defg");
            root.Add("asdfasdf");

            List<string> source=new List<string>();
            source.Add("10072714211596876194");
            source.Add("10072714211596872927");
            source.Add("10072714211596876234");
            source.Add("abc");
            source.Add("abdefg");
            source.Add("asdfasdf");

            List<string> remove;
            List<string> add;
            FindDistinct(root, source, out remove, out add);
        }

        /// <summary>
        /// 归并排序: 查找两个集合中的不同数据
        /// </summary>
        /// <param name="root">源数据集合</param>
        /// <param name="source">新数据集合</param>
        /// <param name="remove">需在源数据中移除的集合</param>
        /// <param name="add">需在源数据中添加的集合</param>
        public void FindDistinct(List<string> root, List<string> source, out List<string> remove, out List<string> add)
        {
            remove = new List<string>();
            add = new List<string>();

            root.Sort();
            source.Sort();
            foreach (string str in root) Console.WriteLine(str);
            Console.WriteLine("\r\n");
            foreach (string str in source) Console.WriteLine(str);
            Console.WriteLine("\r\n");

            int i = 0, j = 0;
            while (i < root.Count && j < source.Count)
            {
                switch (root[i].CompareTo(source[j]))
                {
                    case -1:
                        remove.Add(root[i]); i++;
                        break;
                    case 0:
                        i++; j++;
                        break;
                    case 1:
                        add.Add(source[j]); j++;
                        break;
                }
            }

            if (i < root.Count)
            {
                for (int m = i; m < root.Count; m++) remove.Add(root[m]);
            }
            else if (j < source.Count)
            {
                for (int m = j; m < source.Count; m++) add.Add(source[m]);
            }

            Console.WriteLine("\r\nroot中不同的数据:");
            foreach (string str in remove) Console.WriteLine(str);

            Console.WriteLine("\r\nsource中不同的数据:");
            foreach (string str in add) Console.WriteLine(str);
        }
--------------------编程问答-------------------- 输出结果:


......

root中不同的数据:
10072714211596879733
defg

source中不同的数据:
10072714211596876234
abdefg
--------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 楼上11,12楼说的对,空间复杂度已经没办法进一步优化了,关键是通过排序来降低检索的时间开销 --------------------编程问答-------------------- --------------------编程问答-------------------- public IEnumerable<string> CompareTwoString(string a,string b)
{
  var retVal=(from c in a.Split() select c).Intersect(from e in b.Split() select e);
  return retVal;
}

打完收工!! --------------------编程问答-------------------- 顶了,学习 --------------------编程问答-------------------- --------------------编程问答-------------------- 不要用数组或泛型,用HashTable
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,