FCL应用技巧之------使用List<T>的Distinct()去除重复元素
2013-09-11 20:53
736 查看
1 基本分析
先来看看泛型链表 List<T> 的定义:public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable
可见它实现了 IEnumerable<T>,而IEnumerable<T>规定了Distinct方法。
使用这个方法时要注意:
(1)该方法并不会改变原来的链表;
(2)该方法返回一个对象(假设叫做dis),通过该对象可以枚举原链表中的非重复元素,但是并没有把非重复元素复制一份到新的对象中(连签拷贝也没有)
(3)由于(2),在枚举dis时,始终是依赖于原有链表,所以如果在获得dis后,又更新了原有链表,那么使用dis枚举将会使用原有链表的最新状态。
2 测试代码
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication2 { class IntroToLINQ { static void Main() { List<A> list = new List<A>(); A a = new A(100); list.Add(a); list.Add(a); list.Add(a); IEnumerable<A> distinct = list.Distinct(); //对distinct进行第一次枚举 Console.WriteLine("第一次枚举"); foreach (A aa in distinct) { Console.WriteLine(aa.X); } //改变原有链表 list.Add(new A(200)); //在此对distinct进行枚举 Console.WriteLine("第二次枚举"); foreach (A aa in distinct) { Console.WriteLine(aa.X); } } } class A { private int x; public A(int x) { this.x = x; } public int X { get { return x; } } } }
输出结果:
第一次枚举
100
第二次枚举
100
200
Press any key to continue . . .
3 总结
List<T>的Distinct()方法返回的是一个看待原有链表的视角,类似于Sql语句,其本身并没有存放任何元素,其枚举始终依赖于原有链表。如果要得到一个原有链表的真正非重复元素集合,可以参考如下代码:using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication2 { class IntroToLINQ { static void Main() { List<A> list = new List<A>(); A a = new A(100); list.Add(a); list.Add(a); list.Add(a); IEnumerable<A> distinct = list.Distinct(); //获得list的非重复元素组成的新链表list2 List<A> list2 = new List<A>(); foreach (A aa in distinct) { list2.Add(aa); } list = list2; //如果原有链表不要了,可以重新赋值 } } class A { private int x; public A(int x) { this.x = x; } public int X { get { return x; } } } }
相关文章推荐
- Linq List<T>.Distinct() 去除对象重复
- 去除List<Map<String,Object>>中的map中的重复值
- 去除List<String>中的重复元素
- 检索出 IList<T> 或 List<T>中的不重复数据 Distinct()
- 去除List<Map<String,Object>>中的map的重复值(精简版)
- 去除List<Object>集合中重复的元素(利用HashSet的特性---无重复元素)
- HTML5的<meta> 元素移动端的使用技巧
- 去除List<Object>集合中重复的元素
- 使用HashSet<>去除重复元素的集合
- c#中如何去除List<String>中的重复项
- List<T>中去除重复的元素
- 关于List<T> :Distinct 和 OrderBy 、GroupBy使用简例
- 使用HashSet<>去除重复元素的集合
- MVC中DropDownListFor使用及报错既有键值为“SightId”的值为String,应该为IEnumerable<selectlist>
- List<T>的使用
- 详解HTML<head> 头标签元素的意义以及使用场景
- Dictionary<k, v>使用技巧
- 去除List列表中重复值(稍作调整,也适合于List<T> 和 List<?>)
- List<Map>类型的JavaScript数组应用范例:资讯列表多样化显示
- 从头认识Spring-1.16 SpEl对集合的操作(1)-建立集合以及访问集合的元素,以<util:list/>为例