C# 操作2个list进行比较。

.Net技术 码拜 6年前 (2015-05-10) 523次浏览 0个评论

现在有两个list,分别是list1,list2.
两个list都有相同的字段只是数据不一样,如:
list1:a        list2:b
        1              2
        2              3
        3              4

然后我想得出的结果是list1中有的而list2中没有的数据

 就是比较后,list1只有‘1’这个数据

 求一个详细而简单的例子!

最好不要循环。因为list1数据最少也是10W以上。。list的数据大概是100W

救急啊。。。。。
28分
            List<int> a = new List<int>() { 1, 2, 3, 6, 8, 7 };
            List<int> b = new List<int>() { 1, 2, 3, 4, 5, 6 };
            List<int> c = b.Except(a).ToList();
            foreach (int i in c)
            {
                Console.WriteLine(i); //4  5  
            }
            Console.Read();

这样?

如果是数据库的话left join下判断b是空的应该可以取出来吧
数据都是整数么,是的话能不能先把list1和List2的数据进行基数排序,然后就基于值和索引的查询。
list 2 中的内容放入 hashTable
list 1 中的内容逐个插入 list 2,发生 exception 就扔掉
10分
List<int> a = new List<int> { 1,2,3};
List<int> b = new List<int> { 2,3,3};
a= a.Except(b).ToList();

求差集就可以了
引用 1 楼 xiongxing318 的回复:

救急啊。。。。。

额。。这个方法我也找到了。。我先试试。。主要是要看性能好不好。要快速的。。

大数据量的,确实没有遇到过,学习下
用linq试试
10分
a.Except(b).ToList()
5分
引用 2 楼 a346729576 的回复:
            List<int> a = new List<int>() { 1, 2, 3, 6, 8, 7 };
            List<int> b = new List<int>() { 1, 2, 3, 4, 5, 6 };
            List<int> c = b.Except(a).ToList();
            foreach (int i in c)
            {
                Console.WriteLine(i); //4  5  
            }
            Console.Read();

这样?

这个轻松搞定。。

写个循环都不会吗
10分
        private List<int> ExceptList(List<int> a, List<int> b)
        {
            return (a.Except(b).ToList());
        }
        private List<int> ExceptList(List<int> a, List<int> b)
        {
            List<int> c = new List<int>();
            foreach (int i in a)
            {
                if (!b.Contains(i))
                {
                    c.Add(i);
                }
            }
            return c;
        }
10分
List<int> c = b.Except(a).ToList(); 轻松搞定
100W的List也够大的了。

15楼的试试,我没有试过。

.net具有 SortedList<K,T> 或者 Dictionary<K,T>。其查找效率基于什么原理,我想你应该知道,前者自动会使用二分查找方法,后者自动会使用HashCode查找方法。

关键是你的100W数据插入这样的数据结构,这也需要时间。所以最为可疑的是“你为什么要一次性把它们都读入内存呢?”。假设必须读入内存,那么你是否尽量复用这100w数据?

100W的数据占内存是应该复用。
5分
引用 2 楼 a346729576 的回复:
            List<int> a = new List<int>() { 1, 2, 3, 6, 8, 7 };
            List<int> b = new List<int>() { 1, 2, 3, 4, 5, 6 };
            List<int> c = b.Except(a).ToList();
            foreach (int i in c)
            {
                Console.WriteLine(i); //4  5  
            }
            Console.Read();

这样?

c#已经封装好了、

10分
b.Except(a).Tolist()
引用 5 楼 clark_kidd 的回复:

list 2 中的内容放入 hashTable
list 1 中的内容逐个插入 list 2,发生 exception 就扔掉

这是我见过的最搞笑的回复

linq应该是普通方法的最优解了
不过感觉 从数据格式的角度看看 有没有优化的余地呢?
这么大的数据 全取出来 感觉思路就不对,,从哪取的? 数据库?
引用 23 楼 sj178220709 的回复:
Quote: 引用 5 楼 clark_kidd 的回复:

list 2 中的内容放入 hashTable
list 1 中的内容逐个插入 list 2,发生 exception 就扔掉

这是我见过的最搞笑的回复

这并不搞笑,因为他准确地知道利用list2的hash查找功能。虽然他滥用exception,但是应该看到他的长处。他的主意对于100w数据而言,远远超过“用linq啊”这种主意。

5分
引用 26 楼 diaodiaop 的回复:

这么大的数据 全取出来 感觉思路就不对,,从哪取的? 数据库?

是这样的,这种问题总是很可疑。不过我们也只能说“可疑”,因为并不知道人家的设计的上下文,所以无法做稍微宏观一点的评估。

5分
引用 5 楼 clark_kidd 的回复:

list 2 中的内容放入 hashTable
list 1 中的内容逐个插入 list 2,发生 exception 就扔掉

通常我们不接受随便滥用exception的做法,因为你无法区分出到底是程序有某些bug还是真的属于 !hashtable2.ContainsKey(x) 的结果。

不要把bug当作逻辑控制,因为这会让将来诊断新问题时分不清真假。而且exception处理机制需要巨大的代价。

应该使用if(….containskey) 判断来预先设计程序流程,保留你还能分辨“到底有没有bug”的能力。

引用 29 楼 sp1234 的回复:
Quote: 引用 5 楼 clark_kidd 的回复:

list 2 中的内容放入 hashTable
list 1 中的内容逐个插入 list 2,发生 exception 就扔掉

通常我们不接受随便滥用exception的做法,因为你无法区分出到底是程序有某些bug还是真的属于 !hashtable2.ContainsKey(x) 的结果。

不要把bug当作逻辑控制,因为这会让将来诊断新问题时分不清真假。而且exception处理机制需要巨大的代价。

应该使用if(….containskey) 判断来预先设计程序流程,保留你还能分辨“到底有没有bug”的能力。

受教了

引用 30 楼 clark_kidd 的回复:
Quote: 引用 29 楼 sp1234 的回复:
Quote: 引用 5 楼 clark_kidd 的回复:

list 2 中的内容放入 hashTable
list 1 中的内容逐个插入 list 2,发生 exception 就扔掉

通常我们不接受随便滥用exception的做法,因为你无法区分出到底是程序有某些bug还是真的属于 !hashtable2.ContainsKey(x) 的结果。

不要把bug当作逻辑控制,因为这会让将来诊断新问题时分不清真假。而且exception处理机制需要巨大的代价。

应该使用if(….containskey) 判断来预先设计程序流程,保留你还能分辨“到底有没有bug”的能力。

受教了

+1

我菜鸟 不敢谈算法
2分
引用 13 楼 yangsen600 的回复:
        private List<int> ExceptList(List<int> a, List<int> b)
        {
            return (a.Except(b).ToList());
        }

顶下

感觉学到了许多
看起来好屌.

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 操作2个list进行比较。
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!