有如下这样一个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 数据量比较大。
请大家发挥一下阿。
---------------------------------------------------
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 数据量比较大。
请大家发挥一下阿。
//用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]
//用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();
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
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);
我可以很明确的告诉你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不重复的表
这是机器的内存,跑起来很快的,现在都是2Ghz的cpu和1Ghz的内存
数据只要已进入内存(datatble),那个运算是非常快的......完全可以用我的方法我是erp工程师,每天都和数据打交道,对这方面还是有一定了解的
我可以很明确的告诉你ms没有写类似distinct()的功能
……
我是erp工程师,每天都和数据打交道,对这方面还是有一定了解的
…………
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()));
}
}
}
2326ms
找出数据
209ms
结果
aa,bb,cc,dd,ee