1.最好Sql的时候就去重; 2.将DataSet转成Linq操作。比如: 使用GroupBy:对需要Distinct的字段进行分组,取组内的第一条记录这样结果就是Distinct的数据了。 Console.WriteLine("Distinct1 By: A"); var query1 = from e in User.GetData() group e by new { e.A } into g select g.FirstOrDefault(); foreach (var u in query1) Console.WriteLine(u.ToString()); 或者自己写扩展方法 public static class MyEnumerableExtensions { public static IEnumerable<TSource> DistinctBy<TSource, TKey> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { HashSet<TKey> seenKeys = new HashSet<TKey>(); foreach (TSource element in source) { if (seenKeys.Add(keySelector(element))) { yield return element; } } } } var query3 = User.GetData().DistinctBy(x => new { x.A, x.B, x.C });
去除重复值我都是在SQL中处理的。相对来说会比较容易些。
datatable defaultview totable里面可以去重复。
用Linq可以操作就可以了,不过操作效率会有点慢,这个要看数据量了 建议还是用sql distinct或者group by 去除重复的数据,用程序处理虽好,但改进效率的所花时间较多,还不如用sql+索引提高来得省时间
//
// 摘要:
// 根据现有 System.Data.DataView 中的行,创建并返回一个新的 System.Data.DataTable。
//
// 参数:
// distinct:
// 如果为 true,则返回的 System.Data.DataTable 将包含所有列都具有不同值的行。 默认值为 false。
//
// columnNames:
// 一个字符串数组,包含要包括在返回的 System.Data.DataTable 中的列名的列表。 System.Data.DataTable 包含指定的列,其顺序与这些列在该数组中的顺序相同。
//
// 返回结果:
// 一个新的 System.Data.DataTable 实例,其中包含所请求的行和列。
public DataTable ToTable(bool distinct, params string[] columnNames);
这个不对吧,dtCardNo只剩下某一列的不重复值了,另一个关键列都被删了。我的意思是根据两列连接起来作为关键字来去重复。
DataView dv = dtcpoy.DefaultView;
DataTable table = dv.ToTable(true, new string[] { "QCode", "OKey", "OValue" ,"COrder"}); finalDataSet.Tables.Remove(finalDataSet.Tables["Qs"]); //删除旧表
finalDataSet.Tables.Add(table); //添加新表跑了一下,貌似ToTable留下的是每列不重复值的最大行数。由于我那个表的后三个字段是一致的,所以,看结果貌似也行。
{
这里查询从 0 到 i-1 行为止,有没有至少一行、其指定的两列的值与当前行(第 i 行)都相同的
}
先做排序,然后折半查找替换
2.将DataSet转成Linq操作。比如:
使用GroupBy:对需要Distinct的字段进行分组,取组内的第一条记录这样结果就是Distinct的数据了。
Console.WriteLine("Distinct1 By: A");
var query1 = from e in User.GetData()
group e by new { e.A } into g
select g.FirstOrDefault();
foreach (var u in query1)
Console.WriteLine(u.ToString()); 或者自己写扩展方法
public static class MyEnumerableExtensions
{
public static IEnumerable<TSource> DistinctBy<TSource, TKey> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (seenKeys.Add(keySelector(element))) { yield return element; }
}
}
} var query3 = User.GetData().DistinctBy(x => new { x.A, x.B, x.C });
建议还是用sql distinct或者group by 去除重复的数据,用程序处理虽好,但改进效率的所花时间较多,还不如用sql+索引提高来得省时间
我也想用sql呀,但是数据是从几十个同名的小数据库里面Fill到DataSet的,没法用sql。只能在DataSet里面凑合处理了