110,535
社区成员
发帖
与我相关
我的任务
分享
/// <summary>
/// 按照fieldName从sourceTable中选择出不重复的行,
/// 并且返回sourceTable中所有的列。
/// </summary>
/// 2015-07-27 gaobin
/// <param name="tableName">表名</param>
/// <param name="sourceTable">源表</param>
/// <param name="fieldName">字段</param>
/// <returns>一个新的不含重复行的DataTable</returns>
public static DataTable DistinctSomeColumn(DataTable sourceTable, params string[] fieldName)
{
DataTable dt2 = sourceTable.Clone();
DataView v1 = dt2.DefaultView;
StringBuilder filter = new StringBuilder();
foreach (DataRow row in sourceTable.Rows)
{
for (int i = 0; i < fieldName.Length; i++)
{
filter.AppendFormat("{0}='{1}'", fieldName[i], row[fieldName[i]].ToString().TrimEnd());
if (i < fieldName.Length - 1)
{
filter.Append(" and ");
}
}
v1.RowFilter = filter.ToString();
if (v1.Count > 0)
{
filter = new StringBuilder();
continue;
}
dt2.Rows.Add(row.ItemArray);
filter = new StringBuilder();
}
return dt2;
}
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();
}
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();
}
}
public static DataTable DistinctSomeColumn(DataTable sourceTable, params string[] fieldName)
{
return sourceTable.AsEnumerable().GroupBy(row =>
{
StringBuilder s = new StringBuilder();
fieldName.ToList().ForEach(p => s.Append(row[p].ToString()));
return s.ToString();
}).Select(p => p.First()).CopyToDataTable<DataRow>();
}
public static DataTable DistinctSomeColumn(DataTable sourceTable, params string[] fieldName)
{
//这里应该怎么写代码,才能根据fieldName 中的字段来过滤重复项?
}
{
DataTable 老表= 新表.AsEnumerable().GroupBy(p => p["姓名"]).SelectMany(p => p.GroupBy(s => s["年龄"]).Select(x => x.First())).CopyToDataTable<DataRow>();
也可以