在日常开发过程中,有一个DataTable集合,里面有很多字段,现在要求针对某一列进行排序,如果该列为数字的话,进行ASC即可实现,但是该字段类型为string,此时排序就有点不正确了

protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Age");//因为是字符串,所以排序不对
dt.Rows.Add("小明", "");
dt.Rows.Add("小张", "");
dt.Rows.Add("小红", "");
dt.Rows.Add("小伟", "");
dt.Rows.Add("小美", "");
dt.DefaultView.Sort = "Age ASC";
dt = dt.DefaultView.ToTable(); foreach (DataRow s in dt.Rows)
{
Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>");
}
Response.Write("------------------1----------------<br/>"); #region 方法1:将年龄补齐为2位,然后再进行排序,但是实际不应该有0(仅作参考)
for (int i = ; i < dt.Rows.Count; i++)
{
dt.Rows[i]["Age"] = dt.Rows[i]["Age"].ToString().PadLeft(, '');
}
dt.DefaultView.Sort = "Age ASC"; dt = dt.DefaultView.ToTable(); foreach (DataRow s in dt.Rows)
{
Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>");
}
#endregion Response.Write("------------------2----------------<br/>"); #region 方法2:创建新的DataTable,将Age类型变更为int类型
DataTable dtNew = dt.Clone();
dtNew.Columns["Age"].DataType = typeof(int);//指定Age为Int类型
foreach (DataRow s in dt.Rows)
{
dtNew.ImportRow(s);//导入旧数据
} dtNew.DefaultView.Sort = "Age ASC";
dtNew = dtNew.DefaultView.ToTable(); foreach (DataRow s in dtNew.Rows)
{
Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>");
}
#endregion Response.Write("-----------------3-----------------<br/>"); #region 方法3:添加一列,主要用于排序
dt.Columns.Add("AgeLength", typeof(int), "len(Age)");//添加该列时,DataTable列数据即生成 dt.DefaultView.Sort = "AgeLength,Age ASC";
dt = dt.DefaultView.ToTable(); foreach (DataRow s in dt.Rows)
{
Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>");
}
#endregion Response.Write("-----------------4-----------------<br/>"); #region 方法4:运用LinQ,将DataTable转换为集合,再调用集合自带的排序方法进行排序
foreach (DataRow s in dt.Rows.Cast<DataRow>().OrderBy(r => int.Parse(r["Age"].ToString())))
{
Response.Write(s["Age"].ToString() + "--" + s["Name"].ToString() + "<br/>");
}
#endregion
}

DataTable dataTable;
    1、排序
    1.1、利用查询排序

DataRow[] dataRows = dataTable.Select("条件", "id asc");
//或多列排序
DataRow[] dataRows = dataTable.Select("条件", "id asc,name asc,...");
//对所有的进行排序
DataRow[] dataRows = dataTable.Select("1=1", "id asc,name asc,...");

1.2、默认视图排序

DataView dataView = dataTable.DefaultView;
dataView.Sort = "id asc";
dataTable = dataView.ToTable();

2、搜索

如果单纯搜索,

DataRow[] dataRows = dataTable.Select("条件");
//或者
int id;
string name;
DataRow[] dataRows = dataTable.Select(string.Format(@"id={0} and name={1}",id,name));

如果对搜索结果排序,如同1.1。

说明:select方法如同sql语句对单表的查询,条件如同sql语句的where之后的部分,>,<,=,LIKE等都可以使用。
    3、合并
    合并的对象必须结构要一致,如果不一致先转换一致。然后,利用Merge方法,

DataTable dataTable1 = null;
DataTable dataTable2 = null;
dataTable1.Merge(dataTable2);

相关的DataTable的操作有,
行的初始化:http://blog.csdn.net/yysyangyangyangshan/article/details/7021107。
数组转DataTable:http://blog.csdn.net/yysyangyangyangshan/article/details/6947024。

LINQ的基础查询(使用LINQ to Object)

在此之前,我们先创建一个用于示例的数据源:

  • Student类:表示学生,包括学号、姓名及班级
  • Courses类:表示学生选择的课程,包括学号、课程名称及学时数
  • DataCreator类:静态类,通过GenerateData方法产生示例数据
  • 生成的数据如下:

    学号    姓名    班级    课程名称    学时 
    003        王五    二班    经济学    20 
    003        王五    二班    企业管理    20 
    003        王五    二班    财务管理    30 
    002        李四    一班    历史    20 
    002        李四    一班    政治    20 
    002        李四    一班    语文    30 
    001        张三    一班    数学    20 
    001        张三    一班    语文    20 
    001        张三    一班    物理    15

    Main方法中生成数据:

  • List<Student> students = new List<Student>();
    List<Courses> courses = new List<Courses>();
    DataCreator.GenerateData(students, courses);
  • 筛选

    LINQ中通过where子句筛选数据,where子句后跟条件,from后的对象都可作为where子句判断条件的主体。

  • 实际上from .. in ..语句类似于foreach语句,比如

  • from student in students 类似于 foreach(Student student in students)

  • student是students集合中的元素,那么通常在where语句中,可以使用student作为判断的依据,例如:

  • 筛选出一班的所有学生:

  • var query = from student in students
    where student.Class == "一班"
    select student;
    foreach (var s in query)
    {
    Console.WriteLine(s);
    }
  • 筛选学时大于等于20的课程:

  • var query = from course in courses
    where course.Credit >=
    select course;
  • 可使用&&或||来连接多个条件,如筛选出一班姓张的同学:

  • var query = from student in students
    where student.Class == "一班" && student.Name.StartsWith("张")
    select student;

    当然,并不是说条件语句中只能使用from后的对象,它可以使用任何对象作为判断依据(下面LINQ只作演示没实际意义):条件当前时间等于当前时间,此条件永远为真,故会查询出所有的学生资料。

  • var query = from student in students
    where DateTime.Now == DateTime.Now
    select student;
  • 下例以students集合的数量作为判断条件,当stuents的数量大于等于3时筛选出所有学生资料:
  • var query = from student in students
    where students.Count>=
    select student;
  • 下例筛选学号存在于ids集合中的学生:

  • String[] ids = {"","" };
    var query = from student in students
    where ids.Contains(student.ID)
    select student;
  • 查询选修了语文课程的学生资料:

  • var query = from student in students
    where (from cours in courses where cours.Name == "语文" select cours.StudentId).Contains(student.ID)
    select student;
    foreach (var s in query)
    {
    Console.WriteLine(s);
    }
  • 注意上例中使用了嵌套查询,students where语句中包含另一个LINQ语句,该语句从courses集合中返回选修了语文课程的学号,它是一个IEnumerable<String>集合,所以可以在此集合上使用IEnumerable的Contains方法,判断集合中是否包含当前student对象的ID,包含则返回true,即students的where语句为真,该student对象被添加入结果集合,反之不添加。

  • 排序

排序语句比较简单,基本语法为:

orderby .. ascending | descending[, ..ascending | descending]

其中ascending表示升序排列,descending表示降序排列

var query = from student in students
orderby student.ID ascending /*descending*/
select student;

可根据多个字段进行排序:

var query = from student in students
orderby student.ID ascending,student.Name descending
select student;

以下源码产生示例数据:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinqStudy
{
public static class DataCreator
{
public static void GenerateData(List<Student> students,List<Courses> courses)
{
students.Add(new Student("","张三", "一班"));
students.Add(new Student("", "李四", "一班"));
students.Add(new Student("", "王五", "二班"));
courses.Add(new Courses("", "数学", ));
courses.Add(new Courses("", "语文", ));
courses.Add(new Courses("", "物理", ));
courses.Add(new Courses("", "历史", ));
courses.Add(new Courses("", "政治", ));
courses.Add(new Courses("", "语文", ));
courses.Add(new Courses("", "经济学", ));
courses.Add(new Courses("", "企业管理", ));
courses.Add(new Courses("", "财务管理", ));
}
}
public class Student
{
public String Name { get; set; }
public String Class { get; set; }
public String ID { get; set; }
public Student(String id,String name, String c)
{
ID = id;
Name = name;
Class = c;
}
public override string ToString()
{
return String.Format("学号:{0}\t姓名:{1}\t班级:{2}", this.ID, this.Name, this.Class);
}
}
public class Courses
{
public String Name { get; set; }
public int Credit { get; set; }
public String StudentId { get; set; }
public Courses(String id,String name, int credit)
{
StudentId = id;
Name = name;
Credit = credit;
}
public override string ToString()
{
return String.Format("课程名称:{0}\t学时:{1}", this.Name, this.Credit);
}
}
}

整合:http://www.jb51.net/article/43343.htm

https://blog.csdn.net/yysyangyangyangshan/article/details/7349551

Linq(筛选与排序)

C#对DataTable里数据筛选排序的方法的更多相关文章

  1. 对DataTable里数据进行排序

    在日常开发过程中,有一个DataTable集合,里面有很多字段,现在要求针对某一列进行排序,如果该列为数字的话,进行ASC即可实现,但是该字段类型为string,此时排序就有点不正确了. 我也不多废话 ...

  2. 【转】DataTable 中数据筛选

    转自:http://blog.163.com/yangxw_2009/blog/static/155255217201032931755646/ 对DataTable进行过滤筛选的一些方法Select ...

  3. C#对DataTable里数据排序的方法

    protected void Page_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Ad ...

  4. 去除DataTable重复数据的三种方法

    业务需求 最近做一个把源数据库的数据批次导出到目标数据库.源数据库是采集程序采集而来的原始数据库,所以需要对其进行一些处理(过滤一些为空,长度太短或太长,非法字符,重复数据)然后在进行入库. 其中要避 ...

  5. 去除DataTable重复数据的三种方法(转)

    转自:https://www.cnblogs.com/sunxi/p/4767577.html 业务需求 最近做一个把源数据库的数据批次导出到目标数据库.源数据库是采集程序采集而来的原始数据库,所以需 ...

  6. 对DataTable进行过滤筛选的一些方法Select,dataview

    当你从数据库里取出一些数据,然后要对数据进行整合,你很容易就会想到: DataTable dt = new DataTable();//假设dt是由"SELECT C1,C2,C3 FROM ...

  7. 批量插入数据, 将DataTable里的数据批量写入数据库的方法

    大量数据导入操作, 也就是直接将DataTable里的内容写入到数据库 通用方法: 拼接Insert语句, 好土鳖 1. MS Sql Server:   使用SqlBulkCopy 2. MySql ...

  8. [转]WPF and Silverlight 学习笔记(二十五):使用CollectionView实现对绑定数据的排序、筛选、分组

    在第二十三节,我们使用CollectionView实现了对于绑定数据的导航,除导航功能外,还可以通过CollectionView对数据进行类似于DataView的排序.筛选等功能. 一.数据的排序: ...

  9. #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

    郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...

随机推荐

  1. MySql随手记要

    1. 显示当前正在执行的进程. SHOW FULL PROCESSLIST 2. 显示执行计划. EXPLAIN SQL语句. 3. 强制使用索个索引. 在表名后面接 FORCE INDEX(索引名称 ...

  2. 禁用gridview,listview回弹或下拉悬停

    不同的安卓厂商对ListView或ScrollView都做了一些动画效果,比如下拉时为了产生弹性美感而有大幅度回弹效果,再比如魅族的下拉悬停,有时做了一个下拉刷新的功能会与之冲突.其实该美化实为多此一 ...

  3. 解决Android中多次点击(快速点击多次 )启动多个相同界面的问题

    通过以下代码可以解决这个问题. /** * 防止快速点击 * @param ev * @return */ @Override public boolean dispatchTouchEvent(Mo ...

  4. [企业化NET]Window Server 2008 R2[3]-SVN 服务端 和 客户端 基本使用

    1.  服务器基本安装即问题解决记录      √ 2.  SVN环境搭建和客户端使用 2.1  服务端 和 客户端 安装    √ 2.2  项目建立与基本使用     √ 2.3  基本冲突解决, ...

  5. Http常见错误收集

    HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...

  6. State Threads 回调终结者

    上回写了篇<一个“蝇量级”C语言协程库>,推荐了一下Protothreads,通过coroutine模拟了用户级别的multi-threading模型,虽然本身足够“轻”,杜绝了系统开销, ...

  7. wireshark的拆包与合并

    背景:分析较高并发情景下的通话质量不佳的原因,需要长期抓包. 一.自动打包 1. 指定以1MB的大小打包,这个必须在/var/tmp/目录下执行. tcpdump -i ens32 -vvvv -C ...

  8. [转]如何在Windows 10中更改文件夹背景颜色

    ini文件.我们甚至可以使用相同的技术将图片设置为文件夹背景. 已有工具可以更改Windows 7中Windows资源管理器背景的颜色,并将图像设置为Windows 7中的文件夹背景,但这些工具与Wi ...

  9. [转]postgre 系统表对象说明

    一.pg_class: 该系统表记录了数据表.索引(仍然需要参阅pg_index).序列.视图.复合类型和一些特殊关系类型的元数据.注意:不是所有字段对所有对象类型都有意义. 名字 类型 引用 描述 ...

  10. 转:zTree树控件扩展篇:巧用zTree控件实现文本框输入关键词自动模糊查找zTree树节点实现模糊匹配下拉选择效果

    是否可以借助于zTree实现文本框输入关键词自动模糊匹配zTree下拉树,然后选择下拉树内节点显示在文本框内且隐藏下拉树. 看到这个需求脑子里头大致已经想到了要如何实现这样一个需求,当时是限于时间问题 ...