C#中去除List<T>中重复项的问题/LINQ Distinct重复项

List<T>是.NET中最常用的一种数据结构了,我们常常把需要操作的对象都放到一个List<T>里面。有的时候,我们需要让List<T>中的数据保持唯一性,也就是说List中的数据不能有重复的项。我们知道,List<T>中可以存放任意的类型,如List<int>,List<string>等。为了剔除List<T>中的重复项,.NET为我们提供了一个Distinct()函数。对于普通类型的List,我们可以直接调用该函数剔除掉List中的重复项。下面是示例代码:

List<int> intInList = new List<int>() { 1, 7, 2, 4, 2, 0, 2, 7 };
List<int> newIntList = intInList.Distinct().ToList();
foreach (int i in newIntList)
{
    Console.Write(i + "\t");
}

下面是数据结果:

1       7       2       4       0       Press any key to continue . . .

上面演示了List<int>这种最基本的List,但是,如果此时我们有一个自定义的类,如Person类,那么上面的代码就无法得到正确的结果。代码如下:

public class Person
{
    public string FirstName;
    public string LastName;
} 

class Program
{

    static void Main(string[] args)
    {
        List<Person> personInList = new List<Person>();
        personInList.AddRange(new Person[]{
            new Person()
            {
                 FirstName = "Sheldon",
                  LastName = "Liu"
            },
            new Person()
            {
                FirstName = "Aaron",
                LastName = "Zeng"
            },
            new Person()
            {
                 FirstName = "Sheldon",
                  LastName = "Liu"
            },
            new Person()
            {
                FirstName = "Aaron",
                LastName = "Zeng"
            },
        });

        personInList = personInList.Distinct().ToList();
        foreach (var p in personInList)
        {
            Console.WriteLine(p.FirstName);
        } 

    }
}

下面是运行结果:

Sheldon
Aaron
Sheldon
Aaron
Press any key to continue . . .

可以看到,我们并没有将重复元素去除掉。原因是.NET没办法去比较两个Person实例是否相等。为了让.NET知道两个Person到底谁大,我们需要另外写一个帮助类,该类实现了IEqualityComparer<Person>接口,然后将该类的实例传递到Distinct()中去。这样,.NET就有能力去判断两个Person实例是否相等,也就能从List<Person>中剔除重复项了。代码如下:

public class Person
{
    public string FirstName;
    public string LastName;
}

public class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        if (x.FirstName.Equals(y.FirstName) && x.LastName.Equals(y.LastName))
            return true;
        else
            return false;
    }

    public int GetHashCode(Person obj)
    {
        return obj.FirstName.GetHashCode() * obj.LastName.GetHashCode();
    }
}

class Program
{

    static void Main(string[] args)
    {
        List<Person> personInList = new List<Person>();
        personInList.AddRange(new Person[]{
            new Person()
            {
                 FirstName = "Sheldon",
                  LastName = "Liu"
            },
            new Person()
            {
                FirstName = "Aaron",
                LastName = "Zeng"
            },
            new Person()
            {
                 FirstName = "Sheldon",
                  LastName = "Liu"
            },
            new Person()
            {
                FirstName = "Aaron",
                LastName = "Zeng"
            },
        });

        personInList = personInList.Distinct(new PersonComparer()).ToList();
        foreach (var p in personInList)
        {
            Console.WriteLine(p.FirstName);
        } 

    }
}

运行结果如下:

Sheldon
Aaron
Press any key to continue . . .
时间: 2024-10-12 08:14:00

C#中去除List<T>中重复项的问题/LINQ Distinct重复项的相关文章

[LeetCode] Remove Duplicates from Sorted Array 有序数组中去除重复项

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with constant memory. For example,Given input array A = [

[LeetCode] Remove Duplicates from Sorted Array II 有序数组中去除重复项之二

Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For example,Given sorted array A = [1,1,1,2,2,3], Your function should return length = 5, and A is now [1,1,2,2,3]. 这道题是之前那道Remove Duplicates from Sorted Array 有序数组中

去除list集合中重复项的几种方法

http://www.cnblogs.com/fengri/archive/2013/10/10/3361174.html ? 因为用到list,要去除重复数据,尝试了几种方法.记录于此... 测试数据: List<string> li1 = new List<string> { "8", "8", "9", "9" ,"0","9"}; List<stri

Js中去除数组中重复元素的4种方法

今天工作遇到此问题,尝试多个方法不尽人意,故此写个博客来总结一下如何在js中去除重复元素. 方法1:         Array.prototype.method1 = function(){             var arr[];    //定义一个临时数组             for(var i = 0; i < this.length; i++){    //循环遍历当前数组                 //判断当前数组下标为i的元素是否已经保存到临时数组          

Java基础知识强化之集合框架笔记27:ArrayList集合练习之去除ArrayList集合中的重复字符串元素

1. 去除ArrayList集合中的重复字符串元素(字符串内容相同) 分析: (1)创建集合对象 (2)添加多个字符串元素(包含重复的) (3)创建新的集合 (4)遍历旧集合,获取得到每一个元素 (5)拿着个元素到新集合中去找,看有没有   有:不搭理它 没有:添加到新集合      (6)遍历新集合 2. 案例代码: 1 package cn.itcast_04; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6

去除List列表中重复值(稍作调整,也适合于List&lt;T&gt; 和 List&lt;?&gt;)

方法一 循环元素删除 [c-sharp] view plaincopy public static void removeDuplicate(List list) { for ( int i = 0 ; i < list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j > i; j -- ) { if (list.get(j).equals(list.get(i))) { list.remove(j); } } } System.

去除List集合中的重复元素? 如果没有Set集合,List集合是怎么去除重复元素的(字符串类型,自定义类型)?

 关键字: 如果没有Set集合,List集合是怎么去除重复元素的(字符串类型)?  *   *     思考: List就可以存储重复元素,那么需求中容器中的元素必须保证唯一性,该如何解决呢??  *      *   去除List集合中的重复元素?  * * 思路: * * 1.首先我需要另一个临时容器tempList,用来存放我认为应该保留的元素.(也就是不重复的元素) * 2.然后我们应该遍历原容器, 一个一个的取出元素, 放入tempList. * 当tempList里已经装有刚刚取出的

java集合 collection-list-ArrayList 去除ArrayList集合中的重复元素。

import java.util.*; /* 去除ArrayList集合中的重复元素. */ class ArrayListTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { ArrayList al = new ArrayList(); al.add("java01"); al.add("java02&q

Java 去除 ArrayList 集合中的重复元素

// One practice package Collection; import java.util.ArrayList; import java.util.Iterator; // 去除 ArrayList 集合中的重复元素 public class ArrayListTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) {