精华内容
下载资源
问答
  • C# List集合去重操作注意点
    2021-01-14 15:13:53

    今天调试代码时发现list的distinct方法在对引用类型操作时并没有去重,后来查阅资料发现list去重操作对象集合时比较的是对象的一个个引用地址,

    因为集合里的对象都是一个个单独的实例,所以并不会把内容相同的元素去掉,要想真正去重还是要自己写方法筛选,但是值类型集合的就可以直接操作,包括Unoin,Intersect方法。

    当默认distinct方法不满足需求时,可以使用他的重载方法自定义一个比较器实现IEqualityComparer接口就行了

    这是一个在网上找的可拓展的泛型去重方法

    ///

    /// 可拓展的List对象集合去重比较器

    ///

    /// 要去重的对象类

    /// 自定义去重的字段类型

    public class Compare : IEqualityComparer

    {

    private Func _getField;

    public Compare(Func getfield)

    {

    this._getField = getfield;

    }

    public bool Equals(T x, T y)

    {

    return EqualityComparer.Default.Equals(_getField(x), _getField(y));

    }

    public int GetHashCode(T obj)

    {

    return EqualityComparer.Default.GetHashCode(this._getField(obj));

    }

    }

    ///

    /// 自定义Distinct扩展方法

    ///

    /// 要去重的对象类

    /// 自定义去重的字段类型

    /// 要去重的对象

    /// 获取自定义去重字段的委托

    ///

    public static IEnumerable MyDistinct(this IEnumerable source, Func getfield)

    {

    return source.Distinct(new Compare(getfield));

    }

    调用方式是 List.MyDistinct(s => s.ActivityId).ToList() //可以传委托也可以是匿名方法(lamda表达式)

    更多相关内容
  • c# list对象集合 去重

    2021-01-14 15:14:12
    新建一个类,实现IEqualityComparer接口。注意GetHashCode方法的实现,只有HashCode相同才会去比较public class Compare:...//可以自定义去重规则,此处将Id相同的就作为重复记录,不管学生的爱好是什...

    新建一个类,实现IEqualityComparer接口。注意GetHashCode方法的实现,只有HashCode相同才会去比较

    public class Compare:IEqualityComparer

    {

    public bool Equals(Student x,Student y)

    {

    return x.Id == y.Id;//可以自定义去重规则,此处将Id相同的就作为重复记录,不管学生的爱好是什么

    }

    public int GetHashCode(Student obj)

    {

    return obj.Id.GetHashCode();

    }

    }

    调用:list.Distinct(new Compare()).ToList().ForEach(s => Console.WriteLine(s.ToString()));

    列:

    ///

    ///list对象去重///

    public class Compare : IEqualityComparer{///

    ///

    ///

    ///

    ///

    ///

    public boolEquals(HistoryStatisticsDTO x, HistoryStatisticsDTO y)

    {if (x == null || y == null)return false;if (x.CaseNumId ==x.CaseNumId)

    {return true;

    }else{return false;

    }

    }///

    ///

    ///

    ///

    ///

    public intGetHashCode(HistoryStatisticsDTO obj)

    {if (obj == null)

    {return 0;

    }else{returnobj.CaseNumId.GetHashCode();

    }

    }

    }

    调用: var list=historyStatistics.Distinct(new Compare()).ToList();

    原文:https://www.cnblogs.com/zhangzhiping35/p/11881309.html

    展开全文
  • 此文件搭配本人发表的文章:C#list集合按元素出现次数排序取值(含去重功能),资源完全免费下载,不收取任何费用,纯粹的技术交流。联系方式在文章中有,喜欢的朋友们可以互相交流一下。
  • private void TestDistinct() { Task.Run(() => { //生成测试... textBox1.Text += "去重后数量:" + r1.Count + "," + result2.Count + "," + result3.Count + "," + result4.Count + "" + "\r\n\r\n"; })); }); }

    private void TestDistinct()

    {

    Task.Run(() =>

    {

    //生成测试数据

    DateTime dt = DateTime.Now;

    Random rnd = new Random();

    List list = new List();

    int total = 1000000;

    for (int i = 0; i < total; i++)

    {

    MyData info = new MyData();

    info.id = rnd.Next(1, total * 10).ToString();

    info.name = rnd.Next(1, total * 10).ToString();

    list.Add(info);

    }

    double d = DateTime.Now.Subtract(dt).TotalMilliseconds;

    //方法一

    DateTime dt1 = DateTime.Now;

    Dictionary result1 = new Dictionary();

    foreach (MyData item in list)

    {

    MyData temp;

    if (!result1.TryGetValue(item.name, out temp))

    {

    result1.Add(item.name, item);

    }

    }

    List r1 = result1.Values.ToList();

    double d1 = DateTime.Now.Subtract(dt1).TotalMilliseconds;

    //方法二

    DateTime dt2 = DateTime.Now;

    List result2 = list.ToLookup(item => item.name).ToDictionary(item => item.Key, item => item.First()).Values.ToList();

    double d2 = DateTime.Now.Subtract(dt2).TotalMilliseconds;

    //方法三

    DateTime dt3 = DateTime.Now;

    List result3 = list.Distinct(new MyCompare()).ToList();

    double d3 = DateTime.Now.Subtract(dt3).TotalMilliseconds;

    //方法四

    DateTime dt4 = DateTime.Now;

    List result4 = list.GroupBy(item => item.name).Select(item => item.First()).ToList();

    double d4 = DateTime.Now.Subtract(dt4).TotalMilliseconds;

    this.BeginInvoke(new Action(() =>

    {

    textBox1.Text = "";

    textBox1.Text += "生成 " + list.Count.ToString("# ####") + " 条测试数据耗时:" + d + "毫秒\r\n\r\n";

    textBox1.Text += "使用方法一去重耗时:" + d1 + "毫秒\r\n\r\n";

    textBox1.Text += "使用ToLookup和ToDictionary去重耗时:" + d2 + "毫秒\r\n\r\n";

    textBox1.Text += "使用Distinct去重耗时:" + d3 + "毫秒\r\n\r\n";

    textBox1.Text += "使用GroupBy和Select去重耗时:" + d4 + "毫秒\r\n\r\n";

    textBox1.Text += "去重后数量:" + r1.Count + "," + result2.Count + "," + result3.Count + "," + result4.Count + "" + "\r\n\r\n";

    }));

    });

    }

    f2940af480e1b4b65ede0eee02de2ab9.png

    展开全文
  • 下面小编就为大家带来一篇C#对多个集合和数组的操作方法(合并,去重,判断)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 关键词:C# List 集合 交集、并集、差集、去重对象集合、 对象、引用类型、交并差、List有时候看官网文档是最高效的学习方式!一、简单集合Intersect 交集,Except 差集,Union 并集int[] oldArray = { 1, 2, 3, 4...

    关键词:C#  List 集合 交集、并集、差集、去重, 对象集合、 对象、引用类型、交并差、List

    有时候看官网文档是最高效的学习方式!

    一、简单集合

    Intersect 交集,Except 差集,Union 并集

    int[] oldArray = { 1, 2, 3, 4, 5 };

    int[] newArray = { 2, 4, 5, 7, 8, 9 };

    var jiaoJi = oldArray.Intersect(newArray).ToList();//2,4,5

    var oldChaJi = oldArray.Except(newArray).ToList();//1,3

    var newChaJi = newArray.Except(oldArray).ToList();//7,8,9

    var bingJi = oldArray.Union(newArray).ToList();//1,2,3,4,5,7,8,9

    二、对象集合

    Product[] store1 ={new Product { Name = "apple", Code = 9},new Product { Name = "orange", Code = 4}

    };

    Product[] store2={new Product { Name = "apple", Code = 9},new Product { Name = "lemon", Code = 12}

    };

    IEnumerable union =store1.Union(store2,newProductComparer());

    IEnumerable except=store1.Except(store2,newProductComparer());

    IEnumerable intersect=store1.Intersect(store2,newProductComparer());

    IEnumerable distinct=store1.Distinct(store2,new ProductComparer());

    小提示:

    1:IEnumerable 可以简化为 匿名类型 var

    对自己去重:

    var distinct=store1.Distinct(new ProductComparer());

    相对于别人去重

    var distinct=store1.Distinct(store2,new ProductComparer());

    2: 可以继续进行一些linq或拉姆达操作var distinct=store1.Distinct(store2,new ProductComparer()).OrderBy(c=>c.Code);

    原因是引用了linq组件:using System.Linq;

    三、比较类的实现

    public class Product

    {

    public string Id {get;set}

    public string Name { get; set; }

    public int Code { get; set; }

    }

    1只有一个比较条件

    //如果对象存在唯一主键,例如:从数据库里查询出来的数据存在 ID

    class ProductComparer : IEqualityComparer{//Products are equal if their names and product numbers are equal.

    public boolEquals(Product x, Product y)

    {//Check whether the compared objects reference the same data.

    if (Object.ReferenceEquals(x, y)) return true;//Check whether any of the compared objects is null.

    if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))return false;//Check whether the products' properties are equal.

    return x.ID ==y.ID;

    }//If Equals() returns true for a pair of objects//then GetHashCode() must return the same value for these objects.

    public intGetHashCode(Product product)

    {//Check whether the object is null

    if (Object.ReferenceEquals(product, null)) return 0;//Get hash code for the Code field.

    int hashID =product.ID.GetHashCode();//Calculate the hash code for the product.

    returnhashID;

    }

    }

    2 多个比较条件

    //如果存在组合主键或组合唯一索引,即多个字段组合才能确定唯一性。//Custom comparer for the Product class

    class ProductComparer : IEqualityComparer{//Products are equal if their names and product numbers are equal.

    public boolEquals(Product x, Product y)

    {//Check whether the compared objects reference the same data.

    if (Object.ReferenceEquals(x, y)) return true;//Check whether any of the compared objects is null.

    if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))return false;//Check whether the products' properties are equal.

    return x.Code == y.Code && x.Name ==y.Name;

    }//If Equals() returns true for a pair of objects//then GetHashCode() must return the same value for these objects.

    public intGetHashCode(Product product)

    {//Check whether the object is null

    if (Object.ReferenceEquals(product, null)) return 0;//Get hash code for the Name field if it is not null.

    int hashProductName = product.Name == null ? 0: product.Name.GetHashCode();//Get hash code for the Code field.

    int hashProductCode =product.Code.GetHashCode();//Calculate the hash code for the product.

    return hashProductName ^hashProductCode;

    }

    }

    3 难道我们每次都要“简单重复的”继承IEqualityComparer接口,来重新实现一个“几乎完全相同的”的Compare类吗?

    对于只有一个比较条件的简单情况,我们可以直接对 Distinct、Union、Except、Intersect 进行封装,简单通用方法:

    来源:C#list去重, https://www.cnblogs.com/hao-1234-1234/p/8855218.html

    public class Compare : IEqualityComparer{

    private Func_getField;

    public Compare(Funcgetfield)

    {

    this._getField =getfield;

    }

    public boolEquals(T x, T y)

    {

    return EqualityComparer.Default.Equals(_getField(x), _getField(y));

    }

    public intGetHashCode(T obj)

    {

    return EqualityComparer.Default.GetHashCode(this._getField(obj));

    }

    }

    public static classCommonHelper

    {

    ///

    /// 自定义Distinct扩展方法

    ///

    /// 要去重的对象类

    /// 自定义去重的字段类型

    /// 要去重的对象

    /// 获取自定义去重字段的委托

    ///

    public static IEnumerable MyDistinct(this IEnumerable source, Funcgetfield)

    {

    return source.Distinct(new Compare(getfield));

    }

    }

    然后这么使用:store1.MyDistinct(s=>s.Id).ToList();

    Id 是用于较的属性(或字段),它是可以是任何一个属性。

    4、多个比较条件 的通用方法如何实现?

    类似于 store1.MyDistinct(s=>s.Id&&Name).ToList();

    四、微软官方文档

    union :https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.enumerable.union?view=netframework-4.8

    intersect:https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.enumerable.intersect?view=netframework-4.8

    except:https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.enumerable.except?view=netframework-4.8

    distinct:https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.enumerable.distinct?view=netframework-4.8

    合交并差 核心代码是相同的: IEqualityComparer 。

    建议在看看文档其它部分,以备后用,文档写的很棒!

    例如:join 某些情况与union等效。

    五、交集、并集、差集、补集、对称差集 示意图,

    74e6a239903ccfd9a2bed9a134427ea0.png

    后两者后可以有前三者演变而来。补集可以求差或去重、对称差集可以先求差、在求并;

    参考过的文章

    https://www.oschina.net/code/snippet_222150_16997

    http://www.cnblogs.com/flywing/p/5912242.html

    https://blog.csdn.net/wizblack/article/details/78796557

    展开全文
  • 也可以用于对象去重,我们看看C#对Distinct方法的定义: 有重载,第一个参数都加了this,是拓展方法,有关拓展方法,请百度了解。 下面我们来研究下Distinct的对象去重,假设我们现在有一个People类: public ...
  • 原标题:C#黔驴技巧之去重(Distinct)关于C#中默认的Distinct方法在什么情况下才能去重,这个就不用我再多讲,针对集合对象去重默认实现将不再满足,于是乎我们需要自定义实现来解决这个问题,接下来我们详细讲解几种...
  • C#LINQ对对象进行去重

    2021-03-07 16:42:26
    } } } 其次是调用 // 创建学生集合 ListstuList = new List() { new Student { ID = "1",Name = "张三",Age = 18}, new Student { ID = "2",Name = "李四",Age = 18}, new Student { ID = "3",Name = "王五",Age = ...
  • 去重在我们的开发过程中经常遇到,避免重复元素的添加,我们需要对获取到的集合(包括List、Array等)做相关的过滤操作...由于自己是做.net方面的开发,所以就拿C#语言中常用的去重方式来学习。如果有其他更好的方式,...
  • C# List集合去重使用lambda表达式

    千次阅读 2018-08-03 16:32:50
    如同上表中,名字(name)中重复的想要去除,使用linq进行去重的方法,使用Distinct()根本无法达到要求。那么: var list_distinct = list_Persons.GroupBy(c => c.name).Select(c => c.First()); 实际的意思...
  • C# List 对象去重

    2021-01-14 15:14:12
    扩展类 public static class ObjectExtensions { public static IEnumerable ... 标签:set,C#,IEnumerable,List,element,对象,static,keySelector,public 来源: https://www.cnblogs.com/wfpanskxin/p/13129627.html
  • C# LINQ去重复杂类型对象集合

    千次阅读 2016-05-11 16:56:23
    通过使用LINQ方法语法中的Distinct(),可以去重简单类型集合,如:int、string等。 但如果要去重复杂类型集合,那么 直接调用Distinct()方法是不行的。幸运的是,Distinct()方法可以添加自定义比较方式,简单类型的...
  • 1.实体类 public class Student { public int Id { get; set;...可以直接使用新方法DistinctBy()去重,也可以实现接口IEqualityComparer,重写Equals 和hashCode(可以看看我另外一篇文章通用去重
  • C#】List去重

    2021-04-22 10:06:23
    c# list对象集合 去重 C# List 根据对象属性去重的四种方法对比 问题引出 希望玩家在Unity的Inspector面板上对一个list赋值,随后,程序将对list中的元素进行操作。操作时,不希望list中的对象重复。(若使用...
  • C# 对象集合List按指定属性值去重

    千次阅读 2019-06-10 14:29:44
    最常见的非对象型List去重可直接使用HashSet集合,自动去重 对于对象集合,可如下: list = list.Where((x, i) => list.FindIndex(n => n.Id == x.Id) == i).ToList(); ...
  • C#】list 去重(转载)

    千次阅读 2021-01-26 18:19:06
    Enumerable.Distinct 方法是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组、集合中的重复元素,还可以自定义去重的规则。转载来源:https://www.cnblogs.com/Robert-go-go/p/5399198.html有...
  • c# List去重

    千次阅读 2021-01-26 10:48:16
    需求 : 对List集合中的元素去重。 实现: 有三种方式可以使用 - 使用Linq中distinct()方法 - 借助hashset - 使用for循环遍历,这种方法在数据量大时,运行速度比较慢 代码示例 使用distinct() //使用...
  • .NET[C#]使用LINQ从List集合中删除重复对象元素(去重)的方法有哪些?问题描述比如有如下的List集合:1 Item1 IT00001 $1002 Item2 IT00002 $2003 Item3 IT00003 $1501 Item1 ...
  • 现有一个BSUserRoleResult类 public class BSUserRoleResult { /// <summary> /// 获取或者设置 角色分组编号 /// </summary> public int RoleGroupId { get; set; } ... //...
  • 三、去重Distinct Enumerable.Distinct 方法 定义 命名空间: System.Linq 程序集: System.Linq.dll 返回序列中的非重复元素。 注解 结果序列是无序的。 四、差集Except Enumerable.Except 方法 定义 命名空间: ...
  • (1)使用 java8 自带的方法即可:(推荐使用该方法)List lists = 从某处得来的集合;lists = lists.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,283
精华内容 913
关键字:

c#对象集合去重

c# 订阅