我现在,有个需求就是,不停的输入某个信息,然后最后统一处理。
但是,每次输入后都要判断是否已经输入过了。可能要上千条。且资源还有限。这个定义,不能改了。只能选择好的,优化的,可行的方法去做。
请大家给点思路。c#。最后能有示例代码。非常感谢。

解决方案 »

  1.   

      List<string >ls = new List<string> ()
       ls.Contains("")
    这样应该可以满足吧..
      

  2.   

    Dim List As New List(Of String)
    ...
    List.Contains(...)
      

  3.   

    List <string > 最快
      

  4.   


    不是吧,这么多勋章,给出这么个不合理的方法?显然应该用HashSet<T> (复杂度O(1)),而不是List<T>(复杂度O(n))
      

  5.   

    显然应该用HashSet <T> (复杂度O(1)),而不是List <T>(复杂度O(n))是的,应该使用带索引的集合,这样查找速度很快的。
      

  6.   

    为什么不使用Distinct()呢?
    不管什么先加进来,加入到list<T>里面,然后使用list<T>.Distinct();
    如:
    var sourceFiles = sourceFileList.Distinct();
    sourceFileList是一个List<string> 类型。
      

  7.   

    不好意思,我忘了说了。是2.0的。 不知道有没有hashset。好像3.5才有。请大家再帮帮忙。
      

  8.   

    Dictionary<TKey,TValue>
    其中TValue占位,不用就行了,传一个bool,节省空间
    Dictionary<TKey,bool>
      

  9.   


    2.0也有哈希.楼主看看下面的代码.你的问题就解决了.
    #region ArrayList的示例应用
        /// 方法名:DelArraySame     
        /// 功能:   删除数组中重复的元素
        /// </summary>    
        /// <param name="TempArray">所要检查删除的数组</param>
        /// <returns>返回数组</returns>   
        public string[] DelArraySame(string[] TempArray) 
        {          
            ArrayList nStr = new ArrayList();   
            for (int i = 0; i < TempArray.Length; i++)    
            {              
                if (!nStr.Contains(TempArray[i]))       
                {                 
                    nStr.Add(TempArray[i]);   
                }       
            }        
            string[] newStr = (string[])nStr.ToArray(typeof(string));   
            return newStr;
        }
        #endregion
      

  10.   

    我靠 上面说的方法我一个都不知道........这种重复输入判断,而且量很大的话,还是先排序,然后统一剔除比较快些.
    不排序的话,恐怕只能contains了吧?
    功耗也不是大的要命的
    20-50多万词典数据(纯文本txt),排序,索引建立,数据处理,总之各种折腾内存,大概100M左右,耗时也就几秒.
      

  11.   

    contains这个方法就好用呀,或INDEXOF()
      

  12.   

    Dictionary<key, value> 把你的值都放进去吧,不会有重复的,key和value都为你输入的数据。
      

  13.   


    ArrayList也叫哈希?
    都不知道你的“星”是怎么弄出来的........而且2.0也没人用ArrayList啊,至少也要用List<T>啊,汗.......
      

  14.   

    而且2.0也没人用ArrayList啊,至少也要用List <T>啊,汗.......
    ---------------------------------------------------
    兄弟 可以低调点不?ArrayList2.0中应用还是用的.
      

  15.   

    以前写的 给你来个数字的看看 :
    using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int count=0;
                Random rand = new Random();
                List<int> list = new List<int>();
                while (count < 5)
                {
                    int num = rand.Next(10);
                    if (!list.Contains(num))
                        list.Add(num);
                    else
                        continue;                count++;
                }            foreach (int n in list)
                    Console.WriteLine(n);
            }
        }
      

  16.   

    int count=0;
                Random rand = new Random();
                Hashtable hslist = new Hashtable();
                while (count < 5)
                {
                    int num = rand.Next(10);
                    hslist[num]=0;                count++;
                }            foreach (int n in hslist.keys)
                    Console.WriteLine(n); 
      

  17.   

    泛型
    ArrayList
    哈希
    Dictionary 键值
      

  18.   

    谢谢大家这么帮忙。用得上的,用不上的,都学到很多知识。
    Dictionary,或者说,包括list,hashtable等,这些集合
    在复杂度和资源占用这两方面,谁强谁弱呢?
    另外,怎么去验证。我今天比较了一下hashtable和Dictionary。
    在运行时间上,hashtable是Dictionary的3倍多。        #region "判断是否重复扫码的集合类例子"        int time = 0;
            /// <summary>
            /// 计数
            /// </summary>
            private void count()
            {
                while (true)
                {
                    Thread.Sleep(10);
                    time = time + 1;
                }
            }        /// <summary>
            /// Hashtable 判断重复
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button2_Click(object sender, EventArgs e)
            {
                int c = 0;
                time = 0;
                Thread t = new Thread(new ThreadStart(count));
                t.Start();
                Hashtable hs = new Hashtable();            for(int i = 0;i< 10000;i++)
                {
                    c = c + 1;
                    ClsUser user = new ClsUser();
                    user.CangKuID = "asdjflk";
                    user.Password = "fsadfasdf";
                    user.UserID = "asdfsdaf";
                    if (hs.Contains(i))
                    {
                        MessageBox.Show("double");
                    }
                    else
                    {
                        hs.Add(i, user);
                    }
                }            foreach (DictionaryEntry de in hs)
                {
                    c = c + 1;
                    string key = Convert.ToString(de.Key);
                    ClsUser uu = (ClsUser)de.Value;
                }            t.Abort();            MessageBox.Show("over time=" + Convert.ToString(time) +" cishu:" + Convert.ToString(c));
                
            }        /// <summary>
            /// Dictionary 判断重复
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button3_Click(object sender, EventArgs e)
            {
                int c = 0;
                time = 0;
                Thread t = new Thread(new ThreadStart(count));
                t.Start();
                Dictionary<int, ClsUser> dt = new Dictionary<int, ClsUser>();            for (int i = 0; i < 10000; i++)
                {
                    c = c + 1;
                    ClsUser user = new ClsUser();
                    user.CangKuID = "asdjflk";
                    user.Password = "fsadfasdf";
                    user.UserID = "asdfsdaf";
                    if (dt.ContainsKey(i))
                    {
                        MessageBox.Show("double");
                    }
                    else
                    {
                        dt.Add(i, user);
                    }
                }            foreach (KeyValuePair<int,ClsUser> item in dt)
                {
                    c = c + 1;
                    int key = item.Key;
                    ClsUser uu = item.Value;
                }
                t.Abort();
                MessageBox.Show("over time=" + Convert.ToString(time) + " cishu:" + Convert.ToString(c));
            }        #endregion
      

  19.   

    首先从GetHashcode()的设计开始。如果你输入的内容还有一定规律性的话。