最近用DataTable用得的确有点多,开始的想法是用Linq对datatable进行 处理,进行一下总结:
1.只显示datatable其中需要的几列字段
DataTable yl_dt = new DataTable();
DataColumn dc0 = new DataColumn("卡号");
DataColumn dc1 = new DataColumn("空");
yl_dt.Columns.Add(dc0);
yl_dt.Columns.Add(dc1);
2.datatable中某个字段的求和
1. 列为数字类型
double total= Convert.ToDouble(datatable.Compute("SUM(需要求和的参数)", ""));
2.列为string 类型 先转为数字类型 再求和
double total= dt.AsEnumerable().Select(d => Convert.ToDouble(d.Field<string>("amount"))).Sum();
3.datatable根据条件进行查询
/// <summary>
/// dataTable根据条件查询
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="name">查询字段</param>
/// <param name="value">查询条件值</param>
/// <returns></returns>
public DataTable ConditionQuery(DataTable dt, string name, string value)
{
//根据条件查询
DataRow[] dr = dt.Select(name + " = '" + value + "'");
DataTable dt1 = dt.Clone();
for (int i = 0; i < dr.Length; i++)
{
dt1.ImportRow(dr[i]);
}
return dt1;
}
/// <summary>
/// dataTable过滤筛选条件
/// </summary>
/// <param name="dt"></param>
/// <param name="name"></param>
/// <param name="value"></param>
public DataTable ConditionQuery(DataTable dt, string name, string value)
{
DataView dataview = new DataView(dt);
dataview.RowFilter = $"{name} like'%{value}%'";
return GetDataTable(dataview);
}
/// <summary>
/// 将DataView转化为DataTable
/// </summary>
/// <param name="obDataView"></param>
/// <returns></returns>
public DataTable GetDataTable(DataView obDataView)
{
DataTable obNewDt = obDataView.Table.Clone();
int idx = 0;
string[] strColNames = new string[obNewDt.Columns.Count];
foreach (DataColumn col in obNewDt.Columns)
{
strColNames[idx++] = col.ColumnName;
}
IEnumerator viewEnumerator = obDataView.GetEnumerator();
while (viewEnumerator.MoveNext())
{
DataRowView drv = (DataRowView)viewEnumerator.Current;
DataRow dr = obNewDt.NewRow();
try
{
foreach (string strName in strColNames)
{
dr[strName] = drv[strName];
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
obNewDt.Rows.Add(dr);
}
return obNewDt;
}
4.清除datatable中数据某字段相同的数据
/// <summary>
/// 清除重复字段
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="name">字段名</param>
/// <returns></returns>
public DataTable RefundDataExit(DataTable dt, string name)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
string dr = dt.Rows[i][name].ToString();
for (int j = i + 1; j < dt.Rows.Count; j++)
{
string dr1 = dt.Rows[j][name].ToString();
if (dr == dr1)
{
dt.Rows.RemoveAt(i);
dt.Rows.RemoveAt(j - 1);
if (i == 0)
{
i = -1;
}
}
}
}
return dt;
}
如果大家有更好的方法,或者对datatable操作有其他的方法,欢迎指教