关于去重复问题

http://www.cnblogs.com/A_ming/archive/2013/05/24/3097062.html

如何很好的使用Linq的Distinct方法[全屏看文]

Person1: Id=1, Name="Test1"

Person2: Id=1, Name="Test1"

Person3: Id=2, Name="Test2"

以上list如果直接使用distinct方法进行过滤,仍然返回3条数据,而需要的结果是2条数据。下面给出解这个问题的方法:



方法1: Distinct 方法中使用的相等比较器。这个比较器需要重写Equals和GetHashCode方法,个人不推荐,感觉较麻烦,需要些多余的类,并且用起来还要实例化一个比较器,当然自己也可以写一个泛型的比较器生成工厂用来专门生成比较器,但仍然觉得较麻烦。

MSDN给出的做法,具体参照:http://msdn.microsoft.com/zh-cn/library/bb338049.aspx



方法2:自己扩展一个DistinctBy。这个扩展方法还是很不错的,用起来很简洁,适合为框架添加的Distinct扩展方法。

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;

        }

    }

}

使用方法如下(针对ID,和Name进行Distinct):

var query = people.DistinctBy(p => new { p.Id, p.Name });

若仅仅针对ID进行distinct:

var query = people.DistinctBy(p => p.Id);



方法3:通过GroupBy分组后,并取出第一条数据。简单易用,很方便。这是一种迂回策略,代码理解起来没有Distinct表意清晰,虽然实现了效果。

List<Person> distinctPeople = allPeople

  .GroupBy(p => new {p.Id, p.Name} )

  .Select(g => g.First())

  .ToList();

、、

如何使用Linq或EF来对数据去重——Distinct方法详解

刚开始接触LINQ时使用distinct去重时和大家一样遇到了一些麻烦,很感谢 http://www.cnblogs.com/A_ming/archive/2013/05/24/3097062.html 提供的一些方法。

后来经过深入学习,了解了一些更为简洁的方法,在这里与大家一同分享。

如上图在WebConfig表中含有以下三个字段Name,Linkhref和Type,现在我们要对Type去重获取所有类型。

第一种使用Distinct方法:

ViewBag.Dist = db.WebConfig.Select(p => p.Type).Distinct().ToList();

使用这种方法筛选出来的是一个string集合

前台展示:

<ul>
    @foreach (string dist in ViewBag.Dist)
    {
        <li>@dist</li>
    }
</ul>

第二种使用DistinctBy方法:

 ViewBag.Dist1 = db.WebConfig.DistinctBy(p => p.Type).ToList();

使用这种方法筛选出来的是一个Model类型(WebConfig)

前台展示:

<ul>
    @foreach (WebConfig dist1 in ViewBag.Dist1)
    {
        <li>@dist1.Type</li>
    }
</ul>

第三种使用GroupBy方法:

ViewBag.Dist2 = db.WebConfig.GroupBy(p => p.Type).Select(p=>p.Key).ToList();

使用这种方法筛选出来的是一个键值对(<string,WebConfig>)

前台展示:

<ul>
    @foreach (string dist2 in ViewBag.Dist2)
    {
        <li>@dist2</li>
    }
</ul>
时间: 2024-10-18 09:44:50

关于去重复问题的相关文章

C# List&lt;T&gt;中Select List Distinct()去重复

List<ModelJD> data = myDalJD.GetAllDataList(); List<string> list= new List<string>(); list= datalist4.Select(p => p.name).ToList(); //只取name字段,重新生成新的List集合 this.cmbJdUserName.DataSource = list.Distinct().ToList(); //去重复,绑定数据后面要加ToList

利用Linq对集合元素合并、去重复处理

今晚看了一篇前辈写的linq对集合元素合并去重复处理,觉得有点麻烦,原文地址如下:http://www.cnblogs.com/yjmyzz/archive/2012/12/18/2823170.html#undefined. 于是我自己琢磨利用linq的分组函数,重新写了一个方法,代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ConsoleAp

Oracle单表去重复(一)

去重有两层含义,一:是记录完全一样:二:是符合一定条件的认为是重复. 根据表的数量,去重可划分为:单表去重和多表关联去重. 对于去重,一般最容易想到的是用distinct,而distinct只能对记录完全重复的记录保留一条. distinct使用的是二重循环的方式来去重的,如果数据量非常大的时候,会导致性能急剧下降. 例如:select distinct 字段名 from 原表; 此应用案例,主要有删除表中的完全重复的记录: insert into 临时表 select distinct 字段名

[爬虫学习笔记]基于 SimHash 的去重复处理模块ContentSeen的构建

      Internet上的一些站点常常存在着镜像网站(mirror),即两个网站的内容一样但网页对应的域名不同.这样会导致对同一份网页爬虫重复抓取多次.为了避免这种情况,对于每一份抓取到的网页,它首先需要进入ContentSeen模块.该模块会判断网页的内容是否和已下载过的某个网页的内容一致,如果一致,则该网页不会再被送去进行下一步的处理.这样的做法能够显著的降低爬虫需要下载的网页数.至于如果判断两个网页的内容是否一致,一般的思路是这样的:并不会去直接比较两个网页的内容,而是将网页的内容经

蓝桥杯——说好的进阶之去重复元素的排列组合

将待排列(组合)的数组,先分别统计出种类和个数,然后进行避免重复的排列(组合). /* 1,1,2,3的排列组合 去重复 * (借此复习排列组合) * * 1:2 2个1 * 2:1 1个2 * 3:1 1个3 * * */ static int[] iarr = new int[3];//目标序列 static int[] carr = new int[] { 1, 2, 3 };//3种item static int[] used = new int[] { 2, 1, 1 };//每种it

C# List&lt;T&gt;中Select List Distinct()去重复 摘抄自 随风% 随笔

List<ModelJD> data = myDalJD.GetAllDataList(); List<string> list= new List<string>();list= datalist4.Select(p => p.name).ToList();  //只取name字段,重新生成新的List集合this.cmbJdUserName.DataSource = list.Distinct().ToList(); //去重复,绑定数据后面要加ToList(

DataTable去重复方法

//去掉重复行 DataTable table=new DataTable(); DataView dv = table.DefaultView; table = dv.ToTable(true, new string[] { "name", "code" }); 此时table 就只有name.code无重复的两行了,如果还需要id值则 table = dv.ToTable(true, new string[] { "id","nam

使用Excel2007去重复功能时要注意的一个问题

作者:iamlaosong Excel2007有个去重复功能(菜单:数据----删除重复项),很有用,过去需要用VBA编程实现的功能,现在点击一下图标就行了.去重复一般是指定某列或者某几列,根据这指定的列将重复的删除. 需要注意的是,这个指定的列中的值虽然相同(重复),但未指定的列却不一定相同.删除重复是保留重复项的第一行,删除后续行,因此,最后的结果就和原始数据的排列有关系,不同的排列,虽然指定列留下来的内容是一样的,但非指定列保留下来的内容却有所不同.

SQL去重复查询

SQL单个或分组去重复查询方法 以下是用来测试的数据: 表名:t_Demo ID Name Project Grade 1 小明 数学 59 1 小明 语文 59 1 小明 英语 59 2 小红 数学 100 2 小红 语文 99 3 小白 数学 100 3 小白 语文 90 3 小白 英语 80 3 小白 政治 70 3 小白 历史 60 4 小黑 数学 89 4 小黑 语文 89 4 小黑 英语 90 1.单个字段去重复查询 我们现在想获取以上表格中ID字段信息表,并且去掉重复的数值,也就是

js数组和字符串去重复几种方法

js数组去重复几种方法 第一种:也是最笨的吧. Array.prototype.unique1 = function () { var r = new Array(); label:for(var i = 0, n = this.length; i < n; i++) { for(var x = 0, y = r.length; x < y; x++) { if(r[x] == this[i]) { continue label; } } r[r.length] = this[i]; } re