DataTable不能直接排序,但DataView的Sort方法提供了排序
实列
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("Id");
dt.Columns.Add("Name");
dt.Columns.Add("Age");
dt.Columns.Add("CreateTime");
dt.Rows.Add(new object[] { 1, "张三", 17, "2018-09-09 14:02:53" });
dt.Rows.Add(new object[] { 2, "李四", 18, "2019-10-09 09:28:36" });
dt.Rows.Add(new object[] { 3, "王五", 19, "2020-10-01 12:30:53" });
dt.Rows.Add(new object[] { 4, "李二", 20, "2020-10-03 12:23:13" });
dt.Rows.Add(new object[] { 4, "李二", 20, "2020-10-03 12:23:13" });
dt.Rows.Add(new object[] { 5, "麻子", 21, "2020-10-05 12:59:03" });
dt.Rows.Add(new object[] { 6, "张三", 32, "2020-11-03 13:29:08" });
Console.WriteLine("------------------------------------------------------------1.直接对DataTable数据排序");
dt.DefaultView.Sort = "CreateTime Asc";
dt = dt.DefaultView.ToTable();
for (int i = 0; i < dt.Rows.Count; i++)
{
Console.WriteLine("Id:{0},Name:{1},Age:{2},CreateTime{3}", dt.Rows[i]["Id"].ToString(), dt.Rows[i]["Name"].ToString(), dt.Rows[i]["Age"].ToString(), dt.Rows[i]["CreateTime"].ToString());
}
Console.WriteLine("------------------------------------------------------------2.直接对DataTable数据去重");
dt = dt.DefaultView.ToTable(true, "Id", "Age", "Name", "CreateTime");
for (int j = 0; j < dt.Rows.Count; j++)
{
Console.WriteLine("Id:{0},Name:{1},Age:{2},CreateTime{3}", dt.Rows[j]["Id"].ToString(), dt.Rows[j]["Name"].ToString(), dt.Rows[j]["Age"].ToString(), dt.Rows[j]["CreateTime"].ToString());
}
Console.WriteLine("------------------------------------------------------------按某列去重方法2");
dt = DistinctSomeColumn(dt, "Name");
for (int j = 0; j < dt.Rows.Count; j++)
{
Console.WriteLine("Id:{0},Name:{1},Age:{2},CreateTime{3}", dt.Rows[j]["Id"].ToString(), dt.Rows[j]["Name"].ToString(), dt.Rows[j]["Age"].ToString(), dt.Rows[j]["CreateTime"].ToString());
}
Console.Read();
}
public static DataTable DistinctSomeColumn(DataTable sourceTable, params string[] fieldName)
{
if (fieldName == null || fieldName.Length == 0) return sourceTable;
return sourceTable.AsEnumerable().Distinct(new ColumnEquals(fieldName)).CopyToDataTable();
}
#region 删除DataTable重复列,类似distinct
public static DataTable DeleteSameRow(DataTable dt, string Field)
{
ArrayList indexList = new ArrayList();
for (int i = 0; i < dt.Rows.Count - 1; i++)
{
if (!IsContain(indexList, i))
{
for (int j = i + 1; j < dt.Rows.Count; j++)
{
if (dt.Rows[i][Field].ToString() == dt.Rows[j][Field].ToString())
{
indexList.Add(j);
}
}
}
}
indexList.Sort();
for (int i = indexList.Count - 1; i >= 0; i--)
{
int index = Convert.ToInt32(indexList[i]);
dt.Rows.RemoveAt(index);
}
return dt;
}
public static bool IsContain(ArrayList indexList, int index)
{
for (int i = 0; i < indexList.Count; i++)
{
int tempIndex = Convert.ToInt32(indexList[i]);
if (tempIndex == index)
{
return true;
}
}
return false;
}
#endregion
public class ColumnEquals : IEqualityComparer<DataRow>
{
public ColumnEquals(string[] sArr)
{
_sArr = sArr;
}
private string[] _sArr;
public bool Equals(DataRow x, DataRow y)
{
return !_sArr.Any(p => !x[p].Equals(y[p]));
}
public int GetHashCode(DataRow obj)
{
return obj.ToString().GetHashCode();
}
}
}