//OK的话分全部给你,虽然不多
//有一个datatable里面存放,文件名称(FileName),日志信息(LogInfo),所在文件行号(InFileNum)
//eg:
// FileName LogInfo InFileNum
// a.txt log1 1
// a.txt log1 2
// b.txt log2 1
// c.txt log3 10
// c.txt log3 11
//我想得到结果是
// FileName LogInfo InFileNum
// a.txt log1 1
// b.txt log2 1
// c.txt log3 10
//也就是每一个日志出第一次出现的文件及所在文件内的行号现在已经用了
//方法一:
for (int i = 0; i < dv_All.Table.Rows.Count - 1; i++)
{
if (dv_All.Table.Rows[i]["LogInfo"].ToString().Trim() == dv_All.Table.Rows[i+ 1]["LogInfo"].ToString().Trim))
{
dv_All.Table.Rows[i].Delete();
dv_All.Table.AcceptChanges();
i--;
}
}
// 上面这种依然有重复数据
//方法二:
DataTable dv_All = dv_All.Table.DefaultView.ToTable(true, new string[] { "FileName", "LogInfo", "InFileNum" }).DefaultView;
// 上面这种同第一种一样有重复数据 DataTable dv_All = dv_All.Table.DefaultView.ToTable(true, new string[] {"LogInfo"}).DefaultView;
//这个没有但是只能返回有日志信息(因为dataview的ToTable()方法第二个参数只能写一列字段才能去重,但是这样就不能满足我输出是的多列都有)
distinct 关键字取出重复
where not exists(select 1 from Tb where FileName=t.FileName and [InFileNum]>t.[InFileNum])select *
from Tb t
where [InFileNum] = (select min([InFileNum]) from Tb where FileName=t.FileName)
list.Contains
思路:
第一个for游遍所有数据;
第二个for用这个数据和后面的每一个数据比较,相同的删除
for (int i = 0; i < dv_All.Table.Rows.Count - 1; i++)
{
for(int j=i+1;j < dv_All.Table.Rows.Count - 1;j++)
{
if (dv_All.Table.Rows[i]["LogInfo"].ToString().Trim() == dv_All.Table.Rows[j]["LogInfo"].ToString().Trim))
{
dv_All.Table.Rows[j].Delete();
dv_All.Table.AcceptChanges();
}
}
}
1.最快最简单的,使用hashtable,代码略
2.修改你原来的程序,从后向前查就行了:
for (int i = dv_All.Table.Rows.Count - 1; i >0; i--)
{
if (dv_All.Table.Rows[i]["LogInfo"].ToString().Trim() == dv_All.Table.Rows[i- 1]["LogInfo"].ToString().Trim))
{
dv_All.Table.Rows[i].Delete(); }
}
datatable.select(" group by FileName,LogInfo,InFileNum")
zshdy 不好意思啊,能不能把hashTable方法写一下,因为我也要考虑性能问题,数据量有点儿,一次要过滤十个8M左右的txt文件,所以....谢谢了
我的那条纪录是重复的??本来就是有一些字段里面的值是重复得,所以才来问怎么把重复字段的记录给干掉
for之前的DataTable,判断LogInfo字段的值是否在ArrayList中,如果不在,则向ArrayList添加LogInfo字段的值,同时把该行的值添加到新的DataTable中,那么新的DataTable就是你要的结果。
麻烦您能不能写一下具体,现在半天没弄出结果来,脑子都成空白了。而且我还要考虑性能问题,数据量也有点大。谢啦
dt1是新定义的DataTable;ArrayList arrList = new ArrayList();
for(int i=0;i<dt0.Rows.Count;i++)
{
if(!arrList.Contains(dt0.Rows[i]["LogInfo"].toString()))
{
arrList.Add(dt0.Rows[i]["LogInfo"].toString());
DataRow dr = dt1.NewRow();
dr["FileName"] = dt0.Rows[i]["FileName"];
dr["LogInfo"] = dt0.Rows[i]["LogInfo"];
dr["InFileNum"] = dt0.Rows[i]["InFileNum"];
dt1.Rows.Add(dr);
}
}dt1就是你要的结果。
for (int i = 0; i < dv_All.Table.Rows.Count - 1; i++)
{
if (dv_All.Table.Rows[i]["LogInfo"].ToString().Trim() == dv_All.Table.Rows[i+ 1]["LogInfo"].ToString().Trim))
{
dv_All.Table.Rows[i].Delete(); //改成 dv_All.Table.Rows.RemoveAt(i);
dv_All.Table.AcceptChanges();
i--;
}
}
{
//这里为了简便就不用属性了啊
public string FileName;
public string LogoInfo;
public string InfileNum;
} DataTable dt = new DataTable();
List<File_info> list = new List<File_info>(); foreach(DataRow row in dt.Rows)
{
//初始化实体
File_info f = new File_info();
f.FileName = row["FileInfo"].ToString();
f.LogoInfo = row["LogoInfo"].ToString();
f.InfileNum = row["InfileNum"].ToString(); if (!list.Contains(f))
{
list.Add(f);
}
}楼主,代码我没有运行过,意思大概就是这样了,最后你要的数据就在ArrayList中
{
//这里为了简便就不用属性了啊
public string FileName;
public string LogoInfo;
public string InfileNum;
} DataTable dt = new DataTable();
List<File_info> list = new List<File_info>(); foreach(DataRow row in dt.Rows)
{
//初始化实体
File_info f = new File_info();
f.FileName = row["FileInfo"].ToString();
f.LogoInfo = row["LogoInfo"].ToString();
f.InfileNum = row["InfileNum"].ToString(); if (!list.Contains(f))
{
list.Add(f);
}
}楼主,代码我没有运行过,意思大概就是这样了,最后你要的数据就在List中
差不多根我想的一样,不过放进Table是时候这样做不就不用删除重复的了吗?
方法1:
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = i + 1; j < dt.Rows.Count; j++)
{
if (dt.Rows[i]["UnNum"].ToString().Trim() == dt.Rows[j]["UnNum"].ToString().Trim())
{
dt.Rows.RemoveAt(j); RemoveAt与Delete
//dt.Rows[i].Delete();
//dt.AcceptChanges();
}
}
}
RemoveAt与Delete比较得出delete效率低而且重复数据还有很多,RemoveAt相对性能高方法2:
//ArrayList arrList = new ArrayList();
//for (int i = 0; i < dt.Rows.Count; i++)
//{
// if (!arrList.Contains(dt.Rows[i]["UnNum"].ToString()))
// {
// arrList.Add(dt.Rows[i]["UnNum"].ToString());
// DataRow dr = dt.NewRow();
// dr["FileName"] = dt.Rows[i]["FileName"];
// dr["UnNum"] = dt.Rows[i]["UnNum"];
// dr["InFileNum"] = dt.Rows[i]["InFileNum"];
// dt.Rows.Add(dr);
// }
//}
方法2数据重复还有,性能相对低一些
最后重点感谢fcdesk,cschenlin,hc312117511
在偶不知道第二种方法之前.偶费了好大劲才把这个问题解决.下面把这两个方法都帖出来,请大家批评指正.或有更好的办法也帖出来,一起交流第一种方法: string sql = "Report_proc";
SqlParameter[] paras ={ new SqlParameter("@deptno", "") };
DataTable dt = Utils.SQLHelper.ExecuteProForDataTable(sql, paras);
DataTable dtc = new DataTable(); //新new的一个表,用来存放我们想要的字段(列) for (int i = 0; i < dt.Columns.Count; i++)
{
if (dt.Columns.ColumnName.IndexOf("renshu") == 0)
{
DataColumn dc = new DataColumn(dt.Columns.ColumnName, typeof(string));
dtc.Columns.Add(dc);
}
}
for (int j = 0; j < dt.Rows.Count; j++)
{
DataRow row = dtc.NewRow();
int m = 0;
for (int l = 0; l < dt.Columns.Count; l++)
{ if (dt.Columns[l].ColumnName.IndexOf("renshu") == 0) //我要指取的字段都有一个特征里面都含有renshu这个串
{
if (m < 5) //限制下限,以免超出列的总数,防止出现异常
{
row[m] = (dt.Rows[j][l].ToString() == "" ? 0 : Convert.ToInt32(dt.Rows[j][l].ToString()));
m = m + 1;
}
} }
dtc.Rows.Add(row);//增加一行
}
第二种方法:DataTable newTable = MyDataTable.DefaultView.ToTable(false, new string[] { "ColumnName1", "ColumnName1", "ColumnName1" });
这里我们使用的ToTable方法,相比第一种方法而言,好处大家一看就知道了
这个是办不到的!因为每次都是New了一个对象。而这个对象是引用类型,所以。就算属性值全部一样,判断都是不重复的。起不到判断的作用。
结果还是会重复滴……