有如下这样一个DataTable
---------------------------------------------------
 nameId  name   valueId   value
 2       aa     21        aa-1
 3       bb     31        bb-1
 4       cc     41        cc-1
 2       aa     22        aa-2
 3       bb     32        bb-2
---------------------------------------------------
现在想获得其中关于name的一个arraylist。结果就是 aa bb cc 存在一个
arrayList内请问该如何做,对速度有些要求 因为这个DataTable 数据量比较大。
请大家发挥一下阿。

解决方案 »

  1.   


    //用linq 来实现
     DataTable dt = new DataTable();
                dt.Columns.Add("nameId");
                dt.Columns.Add("name",typeof(string));
                dt.Columns.Add("valueId");
                dt.Columns.Add("value");            dt.Rows.Add("2", "aa", "21", "aa-1");
                dt.Rows.Add("3", "bb", "31", "bb-1");
                dt.Rows.Add("4", "cc", "41", "cc-1");
                dt.Rows.Add("2", "aa", "22", "aa-2");
                dt.Rows.Add("3", "bb", "32", "aa-2");
     
                List<string> list = (from d in dt.AsEnumerable()
                            select d.Field<string>("name")).Distinct().ToList();
                 
    [/code]
      

  2.   


    //用linq 来实现
     DataTable dt = new DataTable();
      dt.Columns.Add("nameId");
      dt.Columns.Add("name",typeof(string));
      dt.Columns.Add("valueId");
      dt.Columns.Add("value");  dt.Rows.Add("2", "aa", "21", "aa-1");
      dt.Rows.Add("3", "bb", "31", "bb-1");
      dt.Rows.Add("4", "cc", "41", "cc-1");
      dt.Rows.Add("2", "aa", "22", "aa-2");
      dt.Rows.Add("3", "bb", "32", "aa-2");
      
      List<string> list = (from d in dt.AsEnumerable()
      select d.Field<string>("name")).Distinct().ToList();
      

  3.   


    void Main()
    {
     DataTable dt = new DataTable();
    dt.Columns.Add("nameId");
    dt.Columns.Add("name",typeof(string));
    dt.Columns.Add("valueId");
    dt.Columns.Add("value"); dt.Rows.Add("2", "aa", "21", "aa-1");
    dt.Rows.Add("3", "bb", "31", "bb-1");
    dt.Rows.Add("4", "cc", "41", "cc-1");
    dt.Rows.Add("2", "aa", "22", "aa-2");
    dt.Rows.Add("3", "bb", "32", "aa-2");
     
    List<string> list = (from d in dt.AsEnumerable()
    select d.Field<string>("name")).Distinct().ToList(); foreach (string s in list)
    {
    Console.WriteLine(s);
    }
    }// 结果:
    aa
    bb
    cc
      

  4.   

    谢谢楼上的 不过 我用的是vs 2005 不支持 linq。不用这个 哪位 有好一些的算法。
      

  5.   


                DataTable dt = new DataTable();
                dt.Columns.Add("nameId");
                dt.Columns.Add("name", typeof(string));
                dt.Columns.Add("valueId");
                dt.Columns.Add("value");            dt.Rows.Add("2", "aa", "21", "aa-1");
                dt.Rows.Add("3", "bb", "31", "bb-1");
                dt.Rows.Add("4", "cc", "41", "cc-1");
                dt.Rows.Add("2", "aa", "22", "aa-2");
                dt.Rows.Add("3", "bb", "32", "aa-2");            ArrayList arrlist = new ArrayList();            string temp;            for (int i = 0; i < dt.Rows.Count; i++)
                {
                    temp = dt.Rows[i]["name"].ToString();                if (!arrlist.Contains(temp))
                        arrlist.Add(temp);
                }            foreach (string s in arrlist)
                    Console.WriteLine(s);
      

  6.   

    这个问题我在好久之前就碰到了
    我可以很明确的告诉你ms没有写类似distinct()的功能
    你只能自己写个方法,比如:
    public DataTable dt_distinct(DataTable dt_old)
            {
                dt_old.DefaultView.Sort = "name desc";//进行排序
                DataTable dt_new = dt_old.DefaultView.ToTable();//放入新表
                string s_name = "";
                DataTable dt_return = dt_new.Clone();
                foreach (DataRow a in dt_new)
                {
                    if (a["name"].ToString() != s_name)
                    {
                        s_name = a["name"].ToString();
                        dt_return.Rows.Add(a);
                    }
                }
                return dt_return;
            }
    这样就可以返回一个name不重复的表
      

  7.   

    我可以告诉你,你数据量100M都没关系
    这是机器的内存,跑起来很快的,现在都是2Ghz的cpu和1Ghz的内存
    数据只要已进入内存(datatble),那个运算是非常快的......完全可以用我的方法我是erp工程师,每天都和数据打交道,对这方面还是有一定了解的
      

  8.   

    ……
    我可以很明确的告诉你ms没有写类似distinct()的功能
    ……
    我是erp工程师,每天都和数据打交道,对这方面还是有一定了解的
    …………
      

  9.   

    随手写了一个 你试试 性能还行using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Data;namespace Itour.Tech
    {
    public class Distinct
    {
    public void Test()
    {
    DataTable dt = new DataTable();
    dt.Columns.Add("nameId");
    dt.Columns.Add("name", typeof(string));
    dt.Columns.Add("valueId");
    dt.Columns.Add("value");

    Stopwatch sw = new Stopwatch();
    sw.Start();
    for(int i = 0;i<100000;i++)
    {
    dt.Rows.Add("2", "aa", "21", "aa-1");
    dt.Rows.Add("3", "bb", "31", "bb-1");
    dt.Rows.Add("4", "cc", "41", "cc-1");
    dt.Rows.Add("2", "dd", "22", "aa-2");
    dt.Rows.Add("3", "ee", "32", "aa-2");
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);

    sw.Reset();
    sw.Start();
    Dictionary<string, Object> dict = new Dictionary<string,object>(50); //这里的值最好是根据实际情况设大一点,也不要太大

    foreach(DataRow aa in dt.Rows)
    {
    dict[aa["name"] as string] = null;
    }

    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
    Console.WriteLine(string.Join("," , dict.Keys.ToArray()));
    }
    }
    }
      

  10.   

    生成数据
    2326ms
    找出数据
    209ms
    结果
    aa,bb,cc,dd,ee