datatable自定义排序问题

钛元素 2017-03-08 10:47:13
我这边从excel使用NOPI,获取到一个dt,然后需要按照一个特定的序列进行排序。

dt列有id,人员姓名,日期时间,等等,我现在有一个txt文件,内容是一个特定的人员姓名列表,就要按这个列表进行排序,如:

人员.txt:
张三
李四
王五

那么,如何实现啊?
...全文
375 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
猿计划 2017-10-24
  • 打赏
  • 举报
回复
datatable怎么进行中文排序
钛元素 2017-03-09
  • 打赏
  • 举报
回复
我还是用两个for语句循环,一个if语句判断,就是冒泡法这样的排序了,唉 我觉得linq还是很强的,我自己没有继续学3.5以后的东西了 谢谢,已经搞定
钛元素 2017-03-09
  • 打赏
  • 举报
回复
引用 6 楼 yuankaiwsl 的回复:
试试这样
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Time");
dt.Columns.Add("Money");
dt.Rows.Add("小红", "2017/03/01", 1);
dt.Rows.Add("小红", "2017/03/02", 2);
dt.Rows.Add("小明", "2017/03/02", 3);
dt.Rows.Add("小明", "2017/03/01", 4);
dt.Rows.Add("小李", "2017/03/02", 5);
dt.Rows.Add("小李", "2017/03/03", 6);
dt.Rows.Add("小李", "2017/03/01", 7);
List<string> names = new List<string>();
names.Add("小明");
names.Add("小红");
names.Add("小李");
foreach (DataRow item in dt.Rows)
{
    Console.WriteLine("\t" + String.Join("\t", item.ItemArray));
}
Console.WriteLine("按照“{0}”的顺序排列:", string.Join("->", names));
var r = dt.AsEnumerable().GroupBy(dr => dr.Field<string>("Name")).Select((g, i) => new { Index = names.IndexOf(g.Key), Values = g.Select(dr => dr) }).OrderBy(a => a.Index).SelectMany(a => a.Values);
foreach (var item in r)
{
    Console.WriteLine("\t" + String.Join("\t", item.ItemArray));
}
结果
	小红	2017/03/01	1
	小红	2017/03/02	2
	小明	2017/03/02	3
	小明	2017/03/01	4
	小李	2017/03/02	5
	小李	2017/03/03	6
	小李	2017/03/01	7
按照“小明->小红->小李”的顺序排列:
	小明	2017/03/02	3
	小明	2017/03/01	4
	小红	2017/03/01	1
	小红	2017/03/02	2
	小李	2017/03/02	5
	小李	2017/03/03	6
	小李	2017/03/01	7
大概意思我看懂了,但是转换object[] 应该是有问题的,不能转换到string[] 难道我一定要用最传统的方法吗
by_封爱 版主 2017-03-08
  • 打赏
  • 举报
回复
引用
我现在有一个txt文件,内容是一个特定的人员姓名列表,就要按这个列表进行排序,如: 人员.txt: 张三 李四 王五
LZ的问题 跟 datatable有什么关系....
钛元素 2017-03-08
  • 打赏
  • 举报
回复
引用 1 楼 qq_25095899 的回复:
dt.DefaultView.Sort = "字段"; dt = dt.DefaultView.ToTable();
我怎么按txt文档里面的人员进行排序,而不搞乱掉dt的其他字段?
钛元素 2017-03-08
  • 打赏
  • 举报
回复
引用 2 楼 yuankaiwsl 的回复:
1、excel的人员这一列有重名的吗? 2、人员.txt里的内容包含excel里所有人员名吗?
1 有,一个人有多条记录 2 所有的都在 我担心用冒泡什么的方法,把dt的其他字段搞乱了
巴士上的邂逅 2017-03-08
  • 打赏
  • 举报
回复
1、excel的人员这一列有重名的吗? 2、人员.txt里的内容包含excel里所有人员名吗?
大然然 2017-03-08
  • 打赏
  • 举报
回复
dt.DefaultView.Sort = "字段"; dt = dt.DefaultView.ToTable();
巴士上的邂逅 2017-03-08
  • 打赏
  • 举报
回复
Select((g, i) => 改成Select(g => 就行
巴士上的邂逅 2017-03-08
  • 打赏
  • 举报
回复
试试这样
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Time");
dt.Columns.Add("Money");
dt.Rows.Add("小红", "2017/03/01", 1);
dt.Rows.Add("小红", "2017/03/02", 2);
dt.Rows.Add("小明", "2017/03/02", 3);
dt.Rows.Add("小明", "2017/03/01", 4);
dt.Rows.Add("小李", "2017/03/02", 5);
dt.Rows.Add("小李", "2017/03/03", 6);
dt.Rows.Add("小李", "2017/03/01", 7);
List<string> names = new List<string>();
names.Add("小明");
names.Add("小红");
names.Add("小李");
foreach (DataRow item in dt.Rows)
{
    Console.WriteLine("\t" + String.Join("\t", item.ItemArray));
}
Console.WriteLine("按照“{0}”的顺序排列:", string.Join("->", names));
var r = dt.AsEnumerable().GroupBy(dr => dr.Field<string>("Name")).Select((g, i) => new { Index = names.IndexOf(g.Key), Values = g.Select(dr => dr) }).OrderBy(a => a.Index).SelectMany(a => a.Values);
foreach (var item in r)
{
    Console.WriteLine("\t" + String.Join("\t", item.ItemArray));
}
结果
	小红	2017/03/01	1
	小红	2017/03/02	2
	小明	2017/03/02	3
	小明	2017/03/01	4
	小李	2017/03/02	5
	小李	2017/03/03	6
	小李	2017/03/01	7
按照“小明->小红->小李”的顺序排列:
	小明	2017/03/02	3
	小明	2017/03/01	4
	小红	2017/03/01	1
	小红	2017/03/02	2
	小李	2017/03/02	5
	小李	2017/03/03	6
	小李	2017/03/01	7

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧