List集合里面去除重复的数据

原创 2016年06月01日 21:28:49

因为用到list,要去除重复数据,尝试了几种方法。记录于此。。。

测试数据:

        List<string> li1 = new List<string> { "8", "8", "9", "9" ,"0","9"};
            List<string> li2 = new List<string> { "张三", "张三", "李四", "张三", "王五", "李四" };
            List<string> li3 = new List<string> { "A", "A", "C", "A", "C", "D" };
            List<string> li4 = new List<string> { "12", "18", "19", "19", "10", "19" };

方法一:

HashSet<string> hs = new HashSet<string>(li1); //此时已经去掉重复的数据保存在hashset中

 

方法二:

复制代码
复制代码
for (int i = 0; i < li2.Count; i++)  //外循环是循环的次数
            {
                for (int j = li2.Count - 1 ; j > i; j--)  //内循环是 外循环一次比较的次数
                {

                    if (li2[i] == li2[j])
                    {
                        li2.RemoveAt(j);
                    }

                }
            }
复制代码
复制代码

 

方法三:

复制代码
复制代码
      //把相同的用null代替。
            for (int i = 0; i < li3.Count; i++)
            {
                for (int j = 0; j < li3.Count; j++)
                {
                    if (i == j) continue;

                    if (li3[i] == li3[j])
                    {
                        li3[j] = "null";
                    }

                }
            }
复制代码
复制代码

 

方法四:

复制代码
复制代码
        //这方法跟上面的一样,只是变了逻辑
            for (int i = 0; i < li4.Count - 1; i++)
            {
                for (int j = 0; j < li4.Count ; j++)
                {
                    if (i != j)
                    {
                        if (li4[i] == li4[j])
                        {
                            li4[j] = "null";
                        }
                    }
                }
            }
复制代码
复制代码

 

最后输出看结果

复制代码
复制代码
        Console.WriteLine("li1去除重复后的值为");
            hs.ToList().ForEach(item => Console.WriteLine(item));

            Console.WriteLine("li2去除重复后的值为");
            li2.ForEach(item => Console.WriteLine(item));

            Console.WriteLine("li3去除重复后的值为");
            li3.ForEach(item => Console.WriteLine(item));

            Console.WriteLine("li4去除重复后的值为");
            li4.ForEach(item => Console.WriteLine(item));
复制代码
复制代码

 

 

null我没去掉。用的时候去掉即可。

 

当然。还有许多办法。比如linq  Distinct  等等都可以,看看网上的这个例子:去掉modelList中title重复的内容,不区分大小写

复制代码
复制代码
 class Program
    {
        static void Main(string[] args)
        {
            List<Model> modelList = new List<Model>() 
            { new Model() { ID = 1, Title = "abcde" },
                new Model() { ID = 2, Title = "ABCDE" },
                new Model(){ ID = 3, Title = "AbcdE" },
                new Model() { ID = 4, Title = "A" }, 
                new Model() { ID = 5, Title = "a" } 
            };
            Console.Read();
        }
    }
    public class Model
    {
        public int ID { get; set; }
        public string Title { get; set; }
    }
复制代码
复制代码

 

解决方案一:这里比较的前提是对象的哈希代码相等。否则不会比较,因为哈希代码不相等。两个对象显然不相等

复制代码
复制代码
//定义一个类继承IEqualityComparer接口
    public class ModelComparer : IEqualityComparer<Model>
    {
        public bool Equals(Model x, Model y)
        {
            return x.Title.ToUpper() == y.Title.ToUpper();
        }
        public int GetHashCode(Model obj)
        {
            return obj.Title.ToUpper().GetHashCode();
        }
    }
复制代码
复制代码

调用:

modelList = modelList.Distinct(new ModelComparer()).ToList();

 

解决方案二:

var title = modelList.GroupBy(m => m.Title.ToLower().Trim()).Select(m => new { ID = m.FirstOrDefault().ID });
            modelList = modelList.Where(m => title.Select(mo => mo.ID).Contains(m.ID)).ToList(); 
            foreach (var item in modelList)
            {
                Console.WriteLine(item.ID + "\t" + item.Title);
            }

 

当然。如果你仅仅比较两个值是否相等。

 List<string> li1 = new List<string> { "8", "8", "9", "8", "0", "9" };
            li1 = li1.Distinct().ToList();

 

关于用集合的remove方法删除list集合中满足条件的元素问题

循环集合的方法有三种: 简单for循环 iterator循环 增强for循环 例子如下: List fList = new ArrayList(); fList...
  • sinat_35495823
  • sinat_35495823
  • 2017-03-31 10:29:59
  • 3635

android 如何正确循环删除list中的数据

当我们使用for循环删除列表中的数据的时候,会存在问题,因为ArrayList的父类AbstractList里有个modCount的字段记录着List的总数,for循环的时候如果增加或者删除了元素,(...
  • ddddwwww2
  • ddddwwww2
  • 2016-11-24 18:49:05
  • 2710

正确在遍历中删除List元素

最近在写代码的时候遇到了遍历时删除List元素的问题,在此写一篇博客记录一下。 一般而言,遍历List元素有以下三种方式: 使用普通for循环遍历 使用增强型for循环遍历 使用iterator遍历...
  • superxlcr
  • superxlcr
  • 2016-05-30 00:45:35
  • 8738

去除List集合中的重复值(四种好用的方法)

**如何去除List集合中的重复值?** 最近项目中需要对list集合中的重复值进行处理,大部分是采用两种方法,一种是用迭代list集合判断后赋给另一个list集合,一种是用赋给set集合再...
  • cs6704
  • cs6704
  • 2015-12-03 11:28:56
  • 113236

Java中List集合去除重复数据的方法

1. 循环list中的所有元素然后删除重复 public static List removeDuplicate(List list) { for ( int i =...
  • u011728105
  • u011728105
  • 2015-06-22 18:50:10
  • 46021

如何从List,ArrayList集合中删除对象,或者其他数据

在开发中,我竟然有时候也会迷糊,下面直接把代码贴上: private ArrayList pathList = new ArrayList(); int num = pathList.size(...
  • android_it
  • android_it
  • 2016-07-30 19:41:41
  • 2754

Java中删除List中的某些数据的方法

经过试验,删除List中某些数据的最好的方法是使用iterator,如果有什么不对的地方,请指正批评;记录代码: /** * 去除未发布状态的课件,并删除其在数据库的存储 * @param ...
  • super_spy
  • super_spy
  • 2015-08-18 09:48:35
  • 2799

List集合去掉重复代码

List ages = new List { 21, 46, 46, 55, 17, 21, 55, 55 };         IEnumerable distinctAges = ages.D...
  • vbloveshllm
  • vbloveshllm
  • 2016-01-13 11:12:11
  • 903

list集合去除重复对象

对象重复是指对象里面的变量的值都相等,并不定是地址。list集合存储的类型是基础类型还比较好办,直接把list集合转换成set集合就会自动去除。    当set集合存储的是对象类型时,需要在对象的实体...
  • emoven
  • emoven
  • 2013-10-24 15:28:18
  • 44677

Java中从list中删除符合条件的数据

在Java语言使用中经常会遇到需要从list中去除一些数据,但是初学者经常会遇到如下的坑:Exception in thread "main" java.lang.IndexOutOfBoundsEx...
  • brian512
  • brian512
  • 2015-12-29 13:59:30
  • 7063
收藏助手
不良信息举报
您举报文章:List集合里面去除重复的数据
举报原因:
原因补充:

(最多只允许输入30个字)